<?xml version="1.0" encoding="UTF-8"?>
<robot generator="Robot 7.4.2 (Python 3.11.10 on linux)" generated="2026-04-07T17:15:51.301666" rpa="false" schemaversion="5">
<suite id="s1" name="ovsdb-upstream-clustering.txt">
<suite id="s1-s1" name="Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster">
<suite id="s1-s1-s1" name="Ovsdb Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot">
<kw name="Suite Setup" 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-07T17:15:51.935581" 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-07T17:15:51.931636" elapsed="0.004009"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-07T17:15:51.931180" elapsed="0.004550"/>
</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-07T17:15:51.940665" 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-07T17:15:51.937164" elapsed="0.003534"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-07T17:15:51.940939" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:51.940808" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:51.940776" elapsed="0.000256"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.941612" 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-07T17:15:51.941198" elapsed="0.000462"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.942179" level="INFO">${cluster_size} = 3</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-07T17:15:51.941829" elapsed="0.000379"/>
</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-07T17:15:51.942771" elapsed="0.000316"/>
</kw>
<msg time="2026-04-07T17:15:51.943196" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:51.943245" level="INFO">${possibly_int_of_members} = 3</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-07T17:15:51.942382" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.943821" level="INFO">${int_of_members} = 3</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-07T17:15:51.943437" elapsed="0.000412"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.945518" 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-07T17:15:51.945215" elapsed="0.000332"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.945956" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:51.945694" elapsed="0.000304"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.946797" 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-07T17:15:51.946289" elapsed="0.000538"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.949891" elapsed="0.000265"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.950641" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.950314" elapsed="0.000353"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.950816" elapsed="0.000320"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.951958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.951648" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:51.952047" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:15:51.952223" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:51.951340" elapsed="0.000908"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:51.952915" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.175:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a1209090&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:15:51.952467" elapsed="0.000625"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.953268" elapsed="0.000203"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:15:51.949210" elapsed="0.004320"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:51.949018" elapsed="0.004557"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.954466" elapsed="0.000190"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.955150" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.954809" elapsed="0.000367"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.955323" elapsed="0.000228"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.956337" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.956043" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:51.956408" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:15:51.956564" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:51.955740" elapsed="0.000849"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:51.957169" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.171.205:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a13d3ed0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:15:51.956737" elapsed="0.000558"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.957451" elapsed="0.000197"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:15:51.953897" elapsed="0.003809"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:51.953718" elapsed="0.004031"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.958744" elapsed="0.000195"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.959430" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.959108" elapsed="0.000348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.959602" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.960604" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:51.960313" elapsed="0.000317"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:51.960675" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:15:51.960828" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:51.960026" elapsed="0.000827"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:51.961459" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.206:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a13cf710&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:15:51.961016" elapsed="0.000551"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.961724" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:15:51.958035" elapsed="0.003952"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:51.957836" elapsed="0.004196"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-07T17:15:51.946891" elapsed="0.015171"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.962623" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</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-07T17:15:51.962223" elapsed="0.000443"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.963234" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.175', 2: '10.30.171.205', 3: '10.30.170.206'}</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-07T17:15:51.962820" elapsed="0.000456"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.963811" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</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-07T17:15:51.963430" elapsed="0.000423"/>
</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-07T17:15:51.944730" elapsed="0.019217"/>
</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-07T17:15:51.936776" elapsed="0.027245"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:51.964205" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:51.964089" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:51.964069" elapsed="0.000206"/>
</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-07T17:15:51.967210" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:51.966812" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.967694" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:51.967394" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:15:51.967765" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:15:51.967925" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:15:51.966488" elapsed="0.001461"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:51.968931" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:51.968670" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:51.969821" 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-07T17:15:51.969930" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:51.969622" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:51.973926" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:51.972941" elapsed="0.001108"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:51.972898" elapsed="0.001218"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:51.974738" 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-07T17:15:51.975016" 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-07T17:15:51.974378" elapsed="0.000735"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.975959" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.175" 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-07T17:15:51.975360" elapsed="0.000760"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:51.977089" 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-07T17:15:51.976374" elapsed="0.000808"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:15:51.978599" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:15:51.978678" 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-07T17:15:51.978241" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:51.978895" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:15:51.980185" level="INFO">Logging into '10.30.170.175:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:15:52.301733" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:15:47 UTC 2026

  System load:  0.07               Processes:             128
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.175
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-51713-168-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:15:51.979844" elapsed="0.322070"/>
</kw>
<msg time="2026-04-07T17:15:52.302014" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:51.979484" elapsed="0.322623"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:15:51.977537" elapsed="0.324763"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.303088" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:15:52.315485" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:15:52.316122" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:15:52.316430" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:15:52.302628" elapsed="0.014009"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.317283" elapsed="0.001084"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.320699" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:52.319552" elapsed="0.001528"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:52.322020" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:52.321404" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.321299" elapsed="0.001039"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:15:52.323209" elapsed="0.000138"/>
</return>
<status status="PASS" start="2026-04-07T17:15:52.322628" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.322540" elapsed="0.001066"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:52.323796" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.328937" elapsed="0.000637"/>
</kw>
<kw name="Open 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-07T17:15:52.329906" elapsed="0.000331"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.330551" elapsed="0.000216"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:52.325149" elapsed="0.005718"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:15:51.971948" elapsed="0.359268"/>
</kw>
<msg time="2026-04-07T17:15:52.331363" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:51.971139" elapsed="0.360302"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:15:51.970629" elapsed="0.360924"/>
</kw>
<msg time="2026-04-07T17:15:52.331610" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:51.970126" elapsed="0.361552"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.335214" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:15:52.335857" elapsed="0.000226"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.336282" elapsed="0.000134"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:52.332098" elapsed="0.004388"/>
</kw>
<msg time="2026-04-07T17:15:52.336611" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:15:51.969184" elapsed="0.367491"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.337288" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:52.336907" elapsed="0.000439"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:15:52.337403" elapsed="0.000040"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:15:51.968326" elapsed="0.369245"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:51.968155" elapsed="0.369513"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:52.338688" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:52.338419" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.339432" 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-07T17:15:52.339533" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.339288" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:52.343148" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:52.342531" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.342325" elapsed="0.001001"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.343944" 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-07T17:15:52.344221" 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-07T17:15:52.343578" elapsed="0.000738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.345182" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.205" 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-07T17:15:52.344563" elapsed="0.000762"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.346288" level="INFO">${conn_id} = 4</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-07T17:15:52.345577" elapsed="0.000801"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.347698" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:15:52.347773" 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-07T17:15:52.347419" elapsed="0.000378"/>
</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-07T17:15:52.348006" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.349247" level="INFO">Logging into '10.30.171.205:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:15:52.682029" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:15:48 UTC 2026

  System load:  0.23               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.205
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-51713-168-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:15:52.348911" elapsed="0.333217"/>
</kw>
<msg time="2026-04-07T17:15:52.682192" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.348530" elapsed="0.333725"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:15:52.346724" elapsed="0.335706"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.683146" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:15:52.695695" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:15:52.696107" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:15:52.696298" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:15:52.682722" elapsed="0.013702"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.696779" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.698839" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:52.698175" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:52.699678" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:52.699321" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.699257" elapsed="0.000616"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:15:52.700453" elapsed="0.000082"/>
</return>
<status status="PASS" start="2026-04-07T17:15:52.700104" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.700019" elapsed="0.000672"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:52.700808" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.705348" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:15:52.706223" elapsed="0.000293"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.706826" elapsed="0.000238"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:52.701565" elapsed="0.005601"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:15:52.341401" elapsed="0.366088"/>
</kw>
<msg time="2026-04-07T17:15:52.707631" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.340719" elapsed="0.366986"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:15:52.340221" elapsed="0.367592"/>
</kw>
<msg time="2026-04-07T17:15:52.707868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.339708" elapsed="0.368221"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.711563" elapsed="0.000448"/>
</kw>
<kw name="Open 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-07T17:15:52.712266" elapsed="0.000198"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.712664" elapsed="0.000166"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:52.708404" elapsed="0.004494"/>
</kw>
<msg time="2026-04-07T17:15:52.713014" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:15:52.338924" elapsed="0.374116"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.713459" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:52.713211" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:15:52.713540" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:15:52.338063" elapsed="0.375598"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:52.337846" elapsed="0.375852"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:52.714607" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:52.714341" elapsed="0.000291"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.715346" 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-07T17:15:52.715445" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:52.715211" elapsed="0.000260"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:52.718824" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:52.718239" elapsed="0.000683"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:52.718198" elapsed="0.000807"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.719637" 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-07T17:15:52.719885" 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-07T17:15:52.719254" elapsed="0.000738"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.720842" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" 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-07T17:15:52.720254" elapsed="0.000746"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.721927" level="INFO">${conn_id} = 7</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-07T17:15:52.721250" elapsed="0.000783"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:15:52.723352" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:15:52.723428" 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-07T17:15:52.723079" elapsed="0.000372"/>
</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-07T17:15:52.723643" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:15:52.725079" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:15:53.041191" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:15:50 UTC 2026

  System load:  0.13               Processes:             127
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-51713-168-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:15:52.724742" elapsed="0.316572"/>
</kw>
<msg time="2026-04-07T17:15:53.041383" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.724384" elapsed="0.317066"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:15:52.722384" elapsed="0.319242"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.042342" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:15:53.054913" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:15:53.055558" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:15:53.055855" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:15:53.041915" elapsed="0.014179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.056674" elapsed="0.001044"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.060070" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.058886" elapsed="0.001516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:53.061295" elapsed="0.000063"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:53.060701" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.060606" elapsed="0.000983"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:15:53.062414" elapsed="0.000126"/>
</return>
<status status="PASS" start="2026-04-07T17:15:53.061862" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.061780" elapsed="0.001010"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:15:53.063000" elapsed="0.000038"/>
</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-07T17:15:53.067601" elapsed="0.000654"/>
</kw>
<kw name="Open 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-07T17:15:53.068590" elapsed="0.000336"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.069258" elapsed="0.000217"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:53.064114" elapsed="0.005460"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:15:52.717277" elapsed="0.352619"/>
</kw>
<msg time="2026-04-07T17:15:53.070123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.716622" elapsed="0.353576"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:15:52.716149" elapsed="0.354159"/>
</kw>
<msg time="2026-04-07T17:15:53.070363" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:52.715619" elapsed="0.354807"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:53.073915" elapsed="0.000452"/>
</kw>
<kw name="Open 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-07T17:15:53.074584" elapsed="0.000196"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.075001" elapsed="0.000137"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:53.070827" elapsed="0.004383"/>
</kw>
<msg time="2026-04-07T17:15:53.075331" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:15:52.714841" elapsed="0.360523"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.075931" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.075651" elapsed="0.000362"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:15:53.076056" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:15:52.713989" elapsed="0.362189"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:52.713796" elapsed="0.362419"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:15:51.968018" elapsed="1.108233"/>
</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-07T17:15:51.964488" elapsed="1.111826"/>
</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-07T17:15:53.076464" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:53.089428" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:53.089319" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.089300" elapsed="0.000195"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.089773" 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-07T17:15:53.089874" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.089641" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.090317" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.090061" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.090744" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.090505" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:53.091563" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:15:53.091305" elapsed="0.000466">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-07T17:15:53.091880" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:15:53.091924" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:53.090937" elapsed="0.001010"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:53.092259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:53.092039" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.092020" elapsed="0.000335"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:53.093158" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.092821" elapsed="0.000363"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:15:53.093231" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:15:53.093392" level="INFO">${odl_ip} = 10.30.170.175</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:53.092550" elapsed="0.000866"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.093562" elapsed="0.000424"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.094268" level="INFO">index=10
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:15:53.094368" level="INFO">${karaf_connection_object} = index=10
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.094151" elapsed="0.000244"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.094545" elapsed="0.002059"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.097053" level="INFO">Logging into '10.30.170.175:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:15:53.880645" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.096767" elapsed="0.784039"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:53.884297" elapsed="0.000397"/>
</kw>
<kw name="Open 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-07T17:15:53.884853" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.885178" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:53.882159" elapsed="0.003170"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:53.881212" elapsed="0.004164"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.089041" elapsed="0.796386"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:15:53.077411" elapsed="0.808064"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:53.077045" elapsed="0.808481"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:53.076892" elapsed="0.808675"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:53.898033" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:53.897900" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.897877" elapsed="0.000230"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.898413" 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-07T17:15:53.898520" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.898267" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.898955" level="INFO">{1: 10}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.898694" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:53.899401" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:53.899162" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:53.900284" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:15:53.900044" elapsed="0.000370">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-07T17:15:53.900524" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:15:53.900569" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:53.899671" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:53.900884" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:53.900667" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:53.900649" elapsed="0.000349"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:53.901716" level="INFO">${ip_address} = 10.30.171.205</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.901456" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:15:53.901789" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:15:53.901939" level="INFO">${odl_ip} = 10.30.171.205</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:53.901194" elapsed="0.000782"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.902126" elapsed="0.000414"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.902811" level="INFO">index=12
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:15:53.902908" level="INFO">${karaf_connection_object} = index=12
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.902707" elapsed="0.000227"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.903098" elapsed="0.002023"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:15:53.905532" level="INFO">Logging into '10.30.171.205:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:15:54.661017" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:15:53.905277" elapsed="0.755930"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:54.664375" elapsed="0.000406"/>
</kw>
<kw name="Open 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-07T17:15:54.664944" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:54.665292" elapsed="0.000100"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:54.662276" elapsed="0.003175"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:54.661601" elapsed="0.003896"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:15:53.897614" elapsed="0.767934"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:15:53.886191" elapsed="0.779404"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:53.885810" elapsed="0.779836"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:53.885672" elapsed="0.780015"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:54.678184" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:54.678066" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:54.678040" elapsed="0.000219"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:54.678536" 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-07T17:15:54.678642" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:54.678403" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:54.679093" level="INFO">{1: 10, 2: 12}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:54.678818" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:54.679521" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:54.679282" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:54.680310" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:15:54.680078" elapsed="0.000347">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-07T17:15:54.680534" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:15:54.680578" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:54.679714" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:54.680887" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:54.680675" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:54.680657" elapsed="0.000343"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:54.681739" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:54.681478" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:15:54.681811" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:15:54.681960" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:54.681206" elapsed="0.000793"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:15:54.682153" elapsed="0.000398"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:54.682820" level="INFO">index=14
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:15:54.682917" level="INFO">${karaf_connection_object} = index=14
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_err...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:15:54.682714" elapsed="0.000229"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:15:54.683098" elapsed="0.003602"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:15:54.687149" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:15:55.436768" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:15:54.686859" elapsed="0.750048"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:55.440123" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:15:55.440803" elapsed="0.000181"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:55.441202" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:55.437984" elapsed="0.003376"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:55.437296" elapsed="0.004111"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:15:54.677762" elapsed="0.763695"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:15:54.666379" elapsed="0.775125"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:54.666014" elapsed="0.775541"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:54.665860" elapsed="0.775736"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-07T17:15:53.076734" elapsed="2.364899"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-07T17:15:51.936142" elapsed="3.505559"/>
</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-07T17:15:55.444193" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.444076" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.444053" 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-07T17:15:55.448662" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.448556" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.448538" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:55.449676" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:55.449288" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:55.450176" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:55.449855" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:15:55.450245" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:15:55.450406" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:15:55.448948" elapsed="0.001483"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.455592" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.455480" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.455462" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.457086" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.456869" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.456851" elapsed="0.000375"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:55.457800" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:55.457367" elapsed="0.000475"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.458332" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:55.458089" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.534222" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:55.459927" elapsed="0.074445"/>
</kw>
<msg time="2026-04-07T17:15:55.534539" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:55.534613" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.458594" elapsed="0.076071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.682233" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:55.536401" elapsed="0.146216"/>
</kw>
<msg time="2026-04-07T17:15:55.682864" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:55.682943" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.534923" elapsed="0.148094"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.683718" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.683253" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.683205" elapsed="0.000700"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:55.684786" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:55.684103" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.685485" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.685166" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.685144" elapsed="0.000514"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:55.685700" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:55.687770" elapsed="0.000342"/>
</kw>
<kw name="Open 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-07T17:15:55.688319" elapsed="0.000183"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:55.688692" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:55.687059" elapsed="0.001855"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:55.686067" elapsed="0.002975"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:55.456513" elapsed="0.232631"/>
</kw>
<msg time="2026-04-07T17:15:55.689241" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:55.689286" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.455830" elapsed="0.233493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:55.689509" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:15:55.689403" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.689384" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.690134" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.690536" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.690609" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:55.455189" elapsed="0.235532"/>
</kw>
<msg time="2026-04-07T17:15:55.690820" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:55.690864" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.450806" elapsed="0.240096"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.691245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.690996" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.690964" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:55.450670" elapsed="0.240677"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.696743" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.696636" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.696618" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.698173" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.697947" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.697930" elapsed="0.000384"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:55.698885" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:55.698456" elapsed="0.000469"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.699419" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:55.699172" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.780631" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:55.701059" elapsed="0.079710"/>
</kw>
<msg time="2026-04-07T17:15:55.780919" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:55.781024" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.699681" elapsed="0.081396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.903716" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:55.782698" elapsed="0.121196"/>
</kw>
<msg time="2026-04-07T17:15:55.904111" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:55.904186" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.781352" elapsed="0.122884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.904744" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.904416" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.904390" elapsed="0.000525"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:55.905630" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:55.905080" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.906299" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.905887" elapsed="0.000554"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.905867" elapsed="0.000600"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:55.906500" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:55.908407" elapsed="0.000318"/>
</kw>
<kw name="Open 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-07T17:15:55.908928" elapsed="0.000174"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:55.909291" elapsed="0.000106"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:55.907695" elapsed="0.001807"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:55.906752" elapsed="0.002843"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:55.697604" elapsed="0.212089"/>
</kw>
<msg time="2026-04-07T17:15:55.909782" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:55.909825" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.697018" elapsed="0.212843"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:55.910066" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:15:55.909937" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.909917" elapsed="0.000268"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.910601" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.911004" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.911078" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:55.696336" elapsed="0.214855"/>
</kw>
<msg time="2026-04-07T17:15:55.911281" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:55.911326" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.691628" elapsed="0.219734"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:55.911714" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:55.911437" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.911419" elapsed="0.000389"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:55.691490" elapsed="0.220346"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.917062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.916938" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.916919" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:55.918422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:55.918244" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:55.918225" elapsed="0.000333"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:55.919124" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:55.918698" elapsed="0.000467"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:55.919629" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:55.919393" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.008732" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:55.921285" elapsed="0.087936"/>
</kw>
<msg time="2026-04-07T17:15:56.009593" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:56.009755" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.919904" elapsed="0.089963"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.124293" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:56.013128" elapsed="0.111368"/>
</kw>
<msg time="2026-04-07T17:15:56.124674" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:56.124748" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.010501" elapsed="0.114298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.125342" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.124994" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.124951" elapsed="0.000566"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.126239" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.125670" elapsed="0.000698"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.126853" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.126544" elapsed="0.001035"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.126523" elapsed="0.001087"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:56.127644" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:56.129629" elapsed="0.000304"/>
</kw>
<kw name="Open 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-07T17:15:56.130186" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:56.130525" elapsed="0.000098"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:56.128810" elapsed="0.001921"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:56.127909" elapsed="0.002914"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:55.917860" elapsed="0.213062"/>
</kw>
<msg time="2026-04-07T17:15:56.131029" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.131074" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.917276" elapsed="0.213836"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:56.131295" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.131189" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.131170" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.131824" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.132216" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.132293" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:55.916645" elapsed="0.215754"/>
</kw>
<msg time="2026-04-07T17:15:56.132491" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.132539" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:55.912183" elapsed="0.220393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.132891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.132650" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.132633" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:55.912040" elapsed="0.220970"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:15:55.450490" elapsed="0.682551"/>
</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-07T17:15:55.448269" elapsed="0.684833"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-07T17:15:55.442302" elapsed="0.690859"/>
</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-07T17:15:55.441851" elapsed="0.691355"/>
</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-07T17:15:51.930806" elapsed="4.202455"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.134263" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-07T17:15:56.133833" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-07T17:15:56.134492" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.134394" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.134374" elapsed="0.000195"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.134902" elapsed="0.000023"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.135093" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.135305" elapsed="0.000021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.135513" elapsed="0.000022"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.135779" elapsed="0.000024"/>
</kw>
<doc>Detect repeated call, or detect number of members and initialize derived suite variables.
Http sessions are created with parameters to not waste time when ODL is no accepting connections properly.</doc>
<status status="PASS" start="2026-04-07T17:15:56.133529" elapsed="0.002336"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:51.930409" elapsed="4.205509"/>
</kw>
<test id="s1-s1-s1-t1" name="Check Shards Status Before Fail" line="17">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:15:56.139200" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:15:56.138924" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.140444" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.140337" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.140319" 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-07T17:15:56.145056" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.144936" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.144918" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.146112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:56.145711" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.146597" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:56.146296" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:15:56.146666" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:56.146818" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:15:56.145342" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.152004" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.151882" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.151863" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.153246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.153139" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.153122" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:56.153810" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:56.153449" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.154249" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:56.154006" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.206750" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:56.154818" elapsed="0.052097"/>
</kw>
<msg time="2026-04-07T17:15:56.207104" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:56.207149" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.154441" elapsed="0.052744"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.281650" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:56.207764" elapsed="0.074094"/>
</kw>
<msg time="2026-04-07T17:15:56.282118" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:56.282165" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.207373" elapsed="0.074829"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.282501" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.282283" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.282262" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.283138" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.282736" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.283519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.283309" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.283291" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:56.283651" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:56.285943" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:15:56.287420" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:56.288839" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:56.284497" elapsed="0.004749"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:56.283910" elapsed="0.005451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:56.152814" elapsed="0.136645"/>
</kw>
<msg time="2026-04-07T17:15:56.289549" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.289592" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.152214" elapsed="0.137414"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:56.289810" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.289704" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.289685" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.290286" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.290617" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.290687" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:56.151550" elapsed="0.139242"/>
</kw>
<msg time="2026-04-07T17:15:56.290883" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.290926" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.147310" elapsed="0.143651"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.291327" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.291064" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.291046" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:56.147166" elapsed="0.144261"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.296599" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.296492" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.296474" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.297892" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.297778" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.297760" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:56.298483" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:56.298127" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.298903" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:56.298662" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.354266" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:56.299493" elapsed="0.054934"/>
</kw>
<msg time="2026-04-07T17:15:56.354596" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:56.354641" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.299099" elapsed="0.055579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.441824" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:56.355269" elapsed="0.086790"/>
</kw>
<msg time="2026-04-07T17:15:56.442250" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:56.442298" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.354843" elapsed="0.087492"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.442655" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.442417" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.442396" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.443336" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.442895" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.443699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.443486" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.443468" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:56.443831" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:56.446340" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:15:56.447842" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:56.449280" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:56.444683" elapsed="0.004996"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:56.444103" elapsed="0.005696"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:56.297445" elapsed="0.152454"/>
</kw>
<msg time="2026-04-07T17:15:56.450007" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.450052" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.296820" elapsed="0.153270"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:56.450277" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.450169" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.450150" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.450745" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.451167" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.451242" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:56.296160" elapsed="0.155192"/>
</kw>
<msg time="2026-04-07T17:15:56.451444" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.451488" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.291677" elapsed="0.159847"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.451848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.451599" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.451582" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:56.291545" elapsed="0.160404"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.457417" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.457308" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.457290" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.458667" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:56.458561" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.458543" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:56.459282" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:56.458874" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.459701" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:15:56.459461" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.512046" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:15:56.460276" elapsed="0.051932"/>
</kw>
<msg time="2026-04-07T17:15:56.512398" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:15:56.512445" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.459879" elapsed="0.052603"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:15:56.600926" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:15:56.513057" elapsed="0.088083"/>
</kw>
<msg time="2026-04-07T17:15:56.601308" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:15:56.601353" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.512655" elapsed="0.088735"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.601689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.601469" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.601449" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.602319" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.601930" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.602676" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.602466" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.602447" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:15:56.602808" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:56.605227" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:15:56.606659" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:15:56.608066" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:15:56.603719" elapsed="0.004733"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:15:56.603107" elapsed="0.005457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:15:56.458263" elapsed="0.150401"/>
</kw>
<msg time="2026-04-07T17:15:56.608755" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.608800" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.457633" elapsed="0.151204"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:15:56.609048" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.608913" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.608894" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.609512" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.610138" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.610212" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:15:56.456954" elapsed="0.153368"/>
</kw>
<msg time="2026-04-07T17:15:56.610415" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:15:56.610459" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.452329" elapsed="0.158167"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.610814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.610570" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.610553" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:56.452192" elapsed="0.158738"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:15:56.146904" elapsed="0.464056"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:15:56.144580" elapsed="0.466451"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:15:56.140054" elapsed="0.471034"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:15:56.139621" elapsed="0.471512"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:15:56.136628" elapsed="0.474558"/>
</kw>
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:15:56.631272" elapsed="0.000228"/>
</kw>
<msg time="2026-04-07T17:15:56.631548" 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-07T17:15:56.630617" elapsed="0.000984"/>
</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 [['topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:15:56.630166" elapsed="0.001510"/>
</kw>
<msg time="2026-04-07T17:15:56.631721" 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-07T17:15:56.622231" elapsed="0.009533"/>
</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-07T17:15:56.621824" elapsed="0.010020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.632322" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.632068" 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-07T17:15:56.637413" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:56.637030" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.637897" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:56.637594" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:15:56.637982" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:15:56.638139" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:15:56.636645" 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-07T17:15:56.638312" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.639186" 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-07T17:15:56.638622" elapsed="0.000592"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.639608" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:56.639369" elapsed="0.000264"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.640027" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:15:56.639776" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.642517" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:56.642157" elapsed="0.000387"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:56.642588" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:56.642735" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:56.641805" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.691523" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:56.691140" elapsed="0.000412"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:56.692355" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:56.692052" elapsed="0.000385">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:56.692533" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:56.691708" elapsed="0.000849"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.693116" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:56.692716" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:15:56.693438" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:15:56.693607" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:15:56.693299" elapsed="0.000337"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.694062" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.693795" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.695062" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.694793" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.695530" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:15:56.695259" elapsed="0.000332"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.695920" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.696138" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.696307" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:15:56.695790" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.695647" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:15:56.696437" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:56.696594" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:15:56.694464" elapsed="0.002154"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:56.694175" elapsed="0.002474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.696815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.696675" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.694156" elapsed="0.002734"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.697494" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:56.697040" elapsed="0.000482"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:15:56.697569" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:15:56.690498" elapsed="0.007192"/>
</kw>
<msg time="2026-04-07T17:15:56.697742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:56.678747" elapsed="0.019104"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.709757" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.721589" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.733400" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.733795" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.734199" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.734735" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.734567" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:15:56.734551" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.734962" elapsed="0.000036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.735143" 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-07T17:15:56.735341" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:15:56.734521" elapsed="0.000874"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.734386" elapsed="0.001047"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.735734" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.735887" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:56.736094" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:15:56.673304" elapsed="0.062839"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:56.738505" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:56.738247" elapsed="0.000340">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:56.738794" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:56.737797" elapsed="0.001041"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.739359" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:56.739031" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.740018" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:56.739706" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:56.739494" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.738940" elapsed="0.001217"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.742654" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:56.740454" elapsed="0.002260"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:15:56.742813" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:15:56.743218" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:56.736997" elapsed="0.006270"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:56.745519" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:56.745269" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:56.745776" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:56.744842" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:15:56.746208" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:15:56.745959" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.745917" elapsed="0.000490"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.746734" elapsed="0.000058"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:56.747182" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:15:56.747328" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:56.749345" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:56.744052" elapsed="0.005343"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.753112" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.752770" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:56.753853" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:56.753529" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:57.662568" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:15:57.667444" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:15:57 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:15:57.668004" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:15:56.756222" elapsed="0.911849"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:56.754149" elapsed="0.914107"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.669010" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.668412" elapsed="0.000806"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.754107" elapsed="0.915237"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.676830" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.672183" elapsed="0.004960"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.671832" elapsed="0.005362"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.671798" elapsed="0.005432"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.680627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.677619" elapsed="0.003070"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.677309" elapsed="0.003428"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.677284" elapsed="0.003488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.686396" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.681030" elapsed="0.005395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.686740" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.686500" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.687306" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.686997" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.686823" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.686479" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.687921" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.687543" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.688267" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.688036" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.688799" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.688505" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.688348" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.688016" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:57.689051" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:15:57.690061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.689566" elapsed="0.000522"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:57.690243" elapsed="0.002143"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:15:57.670951" elapsed="0.021592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.692887" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:57.692687" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.692644" elapsed="0.000402"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:15:57.699286" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:15:57.693351" elapsed="0.005986"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:15:57.699438" elapsed="0.000077"/>
</return>
<msg time="2026-04-07T17:15:57.699751" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:15:56.750155" elapsed="0.949647"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:57.700050" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:57.700308" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:15:56.650773" elapsed="1.049561"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.700675" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.700418" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.700401" elapsed="0.000793"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:57.701228" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:15:56.646818" elapsed="1.054534"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:56.642839" elapsed="1.058555"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:56.642821" elapsed="1.058597"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.702121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:57.702003" elapsed="0.000163"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:15:57.702286" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:15:57.702188" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.701952" elapsed="0.000414"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.702509" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:15:57.702633" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:15:57.701700" elapsed="0.000958"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.703214" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.702818" elapsed="0.000422"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.703853" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.703391" elapsed="0.000489"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.710024" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.709436" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.710805" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.710276" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:57.734317" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:15:57.734556" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:15:57 GMT', 'Expires': 'Tue, 07 Apr 2026 16:15:57 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.368","LastApplied":1,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":1,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":2},{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":1,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":2}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.740 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582157,"status":200} 
 </msg>
<msg time="2026-04-07T17:15:57.734899" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:15:57.715750" elapsed="0.019303"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.710984" elapsed="0.024415"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.735864" elapsed="0.000141"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.735466" elapsed="0.000911"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.710949" elapsed="0.025551"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.744129" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.368","LastApplied":1,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":1,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":1,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":2},{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":1,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":2}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"2.740 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582157,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.740727" elapsed="0.003512"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.739613" elapsed="0.004694"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.739518" elapsed="0.004858"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.747236" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.745038" elapsed="0.002293"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.744522" elapsed="0.002881"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.744480" elapsed="0.002992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.748839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.748039" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.749670" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.749156" elapsed="0.000647"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.750718" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.750238" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.749871" elapsed="0.000962"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.749113" elapsed="0.001793"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.752261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.751462" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.753044" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.752496" elapsed="0.000673"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.754113" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.753580" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.753236" elapsed="0.000992"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.752453" elapsed="0.001840"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:57.754601" elapsed="0.000647"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:15:57.756147" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.755519" elapsed="0.000729"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:57.756512" elapsed="0.002567"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:15:57.737561" elapsed="0.021627"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.759437" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:57.759285" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.759265" elapsed="0.000308"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:15:57.762996" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:15:57.759720" elapsed="0.003307"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:15:57.763159" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:15:57.763321" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:15:57.704830" elapsed="0.058517"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:57.763402" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:15:57.763547" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:15:57.704106" elapsed="0.059467"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.764627" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.764139" elapsed="0.000516"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:15:57.764702" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:57.764873" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:15:57.763790" elapsed="0.001109"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:57.765384" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'id...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:57.765180" elapsed="0.000231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:57.765788" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:57.765561" elapsed="0.000253"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:15:57.765860" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:15:57.766024" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:15:56.641207" elapsed="1.124842"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:15:57.766106" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:15:57.766248" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:15:56.640465" elapsed="1.125807"/>
</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-07T17:15:57.766562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.766352" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:15:57.766843" elapsed="0.000208"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.766642" elapsed="0.000446"/>
</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-07T17:15:57.767253" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.767113" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.766334" elapsed="0.000992"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:15:56.640302" elapsed="1.127048"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.769936" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.769579" elapsed="0.000384"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:57.770023" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:57.770170" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:57.769244" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.818425" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.818049" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:57.819272" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:57.819000" elapsed="0.000357">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:57.819450" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:57.818649" elapsed="0.000825"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.820037" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:57.819634" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:15:57.820361" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:15:57.820514" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:15:57.820221" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.820938" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.820697" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.822116" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.821840" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.822594" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:15:57.822319" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.822952" elapsed="0.000035"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.823169" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.823338" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:15:57.822822" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.822679" elapsed="0.000746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:15:57.823473" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:57.823630" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:15:57.821353" elapsed="0.002302"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.821067" elapsed="0.002618"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.823851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.823710" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.821048" elapsed="0.002877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.824510" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:57.824076" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:15:57.824584" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:15:57.817315" elapsed="0.007390"/>
</kw>
<msg time="2026-04-07T17:15:57.824758" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:57.805666" elapsed="0.019199"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.836873" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.848677" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.860287" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.860693" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.861100" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.861630" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.861468" elapsed="0.000222"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:15:57.861454" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.861853" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.862029" elapsed="0.000024"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.862194" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:15:57.861423" elapsed="0.000823"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.861287" elapsed="0.000997"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.862589" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.862743" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:57.862939" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:15:57.800228" elapsed="0.062777"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:57.865472" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:57.865213" elapsed="0.000337">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:57.865749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:57.864774" elapsed="0.001019"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.866319" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:57.865933" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.866964" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:57.866667" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.866456" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.865891" elapsed="0.001229"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.869796" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:57.867424" elapsed="0.002418"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:15:57.869937" elapsed="0.000125"/>
</return>
<msg time="2026-04-07T17:15:57.870287" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:57.863843" elapsed="0.006494"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:57.872664" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:57.872411" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:57.872923" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:57.871996" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:15:57.873347" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:15:57.873126" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.873085" elapsed="0.000436"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.873831" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:57.874316" elapsed="0.000056"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:15:57.874464" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:57.876333" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:57.871177" elapsed="0.005206"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.879925" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.879590" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:57.880690" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:57.880364" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:58.900897" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:15:58.902002" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:15:58 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:15:58.902610" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:15:57.883061" elapsed="1.019623"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.880922" elapsed="1.021982"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.903643" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.903104" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.880880" elapsed="1.023085"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.914435" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.907618" elapsed="0.007327"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.907108" elapsed="0.007949"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.907059" elapsed="0.008055"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.919047" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.915727" elapsed="0.003366"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.915240" elapsed="0.003887"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.915202" elapsed="0.003950"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.919724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.919323" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.920074" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.919820" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.920624" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:58.920313" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.920156" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.919802" elapsed="0.000909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.921239" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.920860" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.921560" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.921335" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.922098" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:58.921791" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.921640" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.921317" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:58.922329" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:15:58.923159" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.922837" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:58.923337" elapsed="0.002221"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:15:58.905697" elapsed="0.020013"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:58.926076" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:58.925852" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.925809" elapsed="0.000395"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:15:58.932317" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:15:58.926504" elapsed="0.005863"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:15:58.932474" elapsed="0.000072"/>
</return>
<msg time="2026-04-07T17:15:58.932792" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:15:57.877145" elapsed="1.055698"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:58.933092" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:15:58.933354" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:15:57.777924" elapsed="1.155457"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.933719" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.933465" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.933448" elapsed="0.000769"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:58.934250" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:15:57.773957" elapsed="1.160417"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:57.770260" elapsed="1.164158"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:57.770243" elapsed="1.164199"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:15:58.935110" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:58.934999" elapsed="0.000155"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:15:58.935275" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:15:58.935176" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.934948" elapsed="0.000406"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.935494" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:15:58.935611" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:15:58.934699" elapsed="0.000936"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.936178" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.935793" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.936832" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:58.936353" elapsed="0.000507"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.942871" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.942320" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.943723" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.943185" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:15:58.972528" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:15:58.972766" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:15:58 GMT', 'Expires': 'Tue, 07 Apr 2026 16:15:58 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":1,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.656 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582158,"status":200} 
 </msg>
<msg time="2026-04-07T17:15:58.973153" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:15:58.948576" elapsed="0.024690"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.943887" elapsed="0.029714"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.974096" elapsed="0.000106"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.973667" elapsed="0.000893"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.943868" elapsed="0.030748"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.982791" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":1,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.656 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582158,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.978907" elapsed="0.003990"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.977715" elapsed="0.005249"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.977607" elapsed="0.005440"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.985858" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:58.983661" elapsed="0.002291"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.983189" elapsed="0.002844"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.983149" elapsed="0.002951"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.987429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.986636" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.988208" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.987664" elapsed="0.000667"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.989238" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:58.988754" elapsed="0.000528"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.988397" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.987622" elapsed="0.001792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.990749" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.989952" elapsed="0.000897"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:58.991494" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:58.991002" elapsed="0.000615"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:58.992586" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:58.992091" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:58.991683" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.990945" elapsed="0.001824"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:58.993082" elapsed="0.000625"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:15:58.994592" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:58.993990" elapsed="0.000701"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:15:58.994951" elapsed="0.002498"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:15:58.975649" elapsed="0.021907"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:58.997793" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:15:58.997650" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:58.997631" elapsed="0.000295"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:15:59.001231" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:15:58.998080" elapsed="0.003180"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:15:59.001358" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:15:59.001514" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:15:58.937797" elapsed="0.063743"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:15:59.001626" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:15:59.001772" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:15:58.937084" elapsed="0.064714"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.002835" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:59.002360" elapsed="0.000503"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:15:59.002911" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:15:59.003096" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:15:59.002028" elapsed="0.001095"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:59.003468" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:59.003274" elapsed="0.000221"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:15:59.003838" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:15:59.003642" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:15:59.003908" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:15:59.004178" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:15:57.768583" elapsed="1.235621"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:15:59.004264" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:15:59.004566" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:15:57.767681" elapsed="1.236921"/>
</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="PASS" start="2026-04-07T17:15:59.004952" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:59.004686" elapsed="0.000533"/>
</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-07T17:15:59.005383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:59.005244" 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-07T17:15:59.005603" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:59.005466" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.004668" elapsed="0.001008"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:15:57.767516" elapsed="1.238184"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.008396" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:59.008035" elapsed="0.000389"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:15:59.008469" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:15:59.008621" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:15:59.007559" elapsed="0.001086"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.056631" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:59.056250" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:59.057413" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:59.057156" elapsed="0.000335">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:59.057629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:59.056814" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.058210" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:59.057813" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:15:59.058528" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:15:59.058676" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:15:59.058390" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.059106" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:59.058850" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.060212" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:59.059943" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.060691" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:15:59.060417" elapsed="0.000299"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.061049" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.061249" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.061418" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:15:59.060906" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:15:59.060768" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:15:59.061547" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:59.061745" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:15:59.059499" elapsed="0.002275"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:59.059217" elapsed="0.002589"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.061986" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:59.061831" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.059198" elapsed="0.002865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.062623" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:15:59.062198" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:15:59.062696" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:15:59.055635" elapsed="0.007181"/>
</kw>
<msg time="2026-04-07T17:15:59.062868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:15:59.043963" elapsed="0.019036"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.074626" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.086176" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.097718" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.098133" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.098510" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.099022" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:59.098867" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:15:59.098851" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.099239" 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-07T17:15:59.099400" 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-07T17:15:59.099560" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:15:59.098822" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:15:59.098690" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.099945" elapsed="0.000070"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:15:59.100118" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:59.100329" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:15:59.038512" elapsed="0.061869"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:59.102679" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:59.102436" elapsed="0.000307">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:59.102933" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:59.102022" elapsed="0.000983"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.103473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:15:59.103146" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.104124" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:15:59.103812" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:59.103608" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.103106" elapsed="0.001157"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.106902" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:15:59.104584" elapsed="0.002363"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:15:59.107107" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:15:59.107388" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:59.101217" elapsed="0.006219"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:15:59.109733" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:15:59.109482" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:15:59.110049" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:15:59.109071" elapsed="0.001024"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:15:59.110457" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:15:59.110236" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.110195" elapsed="0.000422"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.110916" elapsed="0.000177"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:15:59.111419" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:15:59.111565" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:15:59.113450" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:15:59.108231" elapsed="0.005268"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.117270" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:59.116926" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:15:59.118032" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:15:59.117693" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.177688" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.178723" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:16:00 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:00.179283" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:15:59.120359" elapsed="1.059011"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:59.118265" elapsed="1.061296"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.180303" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.179708" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.118223" elapsed="1.062429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.187929" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.184093" elapsed="0.004158"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.183738" elapsed="0.004565"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.183701" elapsed="0.004637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.191724" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.188722" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.188417" elapsed="0.003418"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.188393" elapsed="0.003476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.192656" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.192119" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.193141" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.192789" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.193888" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.193472" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.193256" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.192764" elapsed="0.001264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.194739" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.194239" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.195207" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.194872" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.195953" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.195573" elapsed="0.000419"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.195349" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.194847" elapsed="0.001203"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.196199" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.197017" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.196703" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.197193" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.182350" elapsed="0.017208"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.199902" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.199700" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.199659" elapsed="0.000394"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.206084" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.200358" elapsed="0.005776"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.206229" elapsed="0.000070"/>
</return>
<msg time="2026-04-07T17:16:00.206525" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:15:59.114240" elapsed="1.092336"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.206802" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:00.207074" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:15:59.016277" elapsed="1.190824"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.207468" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.207185" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.207168" elapsed="0.000778"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.207994" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:15:59.012406" elapsed="1.195715"/>
</kw>
<status status="PASS" start="2026-04-07T17:15:59.008711" elapsed="1.199454"/>
</branch>
<status status="PASS" start="2026-04-07T17:15:59.008694" elapsed="1.199494"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.208816" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.208711" elapsed="0.000148"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:00.209014" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.208881" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.208693" elapsed="0.000403"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.209238" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:16:00.209356" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:00.208445" elapsed="0.000936"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.209909" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.209538" elapsed="0.000397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.210558" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.210103" elapsed="0.000481"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.217769" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.217224" elapsed="0.000628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.218574" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.218033" elapsed="0.000622"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.250175" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.250405" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Follower","LastApplied":1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"2.208 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582160,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:00.250760" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.223530" elapsed="0.027342"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.218738" elapsed="0.032516"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.251765" elapsed="0.000102"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.251366" elapsed="0.000894"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.218719" elapsed="0.033597"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.261599" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-operational","LastIndex":1,"RaftState":"Follower","LastApplied":1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"2.208 ms","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":218},"timestamp":1775582160,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.256540" elapsed="0.005295"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.255354" elapsed="0.006663"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.255241" elapsed="0.006930"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.265963" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.263638" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.262488" elapsed="0.003652"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.262400" elapsed="0.003806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.267541" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.266739" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.268289" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.267784" elapsed="0.000631"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.269376" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.268831" elapsed="0.000591"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.268482" elapsed="0.001009"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.267741" elapsed="0.001815"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.270879" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.270109" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.271646" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.271133" elapsed="0.000638"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.272671" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.272205" elapsed="0.000511"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.271838" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.271092" elapsed="0.001757"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.273169" elapsed="0.000626"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.274812" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.274195" elapsed="0.000715"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.275191" elapsed="0.002412"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.253337" elapsed="0.024379"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.277959" elapsed="0.000145"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.277813" elapsed="0.000388"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.277794" elapsed="0.000433"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.281501" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.278369" elapsed="0.003162"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.281631" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:00.281787" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.211539" elapsed="0.070274"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.281900" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:00.282129" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.210793" elapsed="0.071363"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.283196" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.282708" elapsed="0.000516"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:00.283289" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:00.283458" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755821...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:00.282372" elapsed="0.001112"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.283833" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.283637" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.284223" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.284025" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:00.284294" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:00.284441" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:15:59.006943" elapsed="1.277522"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:00.284521" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:00.284665" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:15:59.006220" elapsed="1.278469"/>
</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="PASS" start="2026-04-07T17:16:00.284991" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.284767" elapsed="0.000457"/>
</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-07T17:16:00.285387" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.285248" 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-07T17:16:00.285600" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.285464" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.284751" elapsed="0.000921"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:15:59.005873" elapsed="1.279823"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:15:56.640101" elapsed="3.645630"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:00.285775" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:00.286059" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:00.286110" level="INFO">${follower_list} = [2, 3]</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-07T17:15:56.635924" elapsed="3.650210"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.286574" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:00.286650" level="INFO">${leader_count} = 1</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-07T17:16:00.286304" elapsed="0.000369"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.286948" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.286742" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.286724" elapsed="0.000317"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.289274" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:00.287173" elapsed="0.002148"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:00.289712" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.289516" elapsed="0.000222"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:00.289785" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:15:56.633468" elapsed="3.656472"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:15:56.633128" elapsed="3.656919"/>
</iter>
<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-07T17:16:00.294287" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.293884" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.294768" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:00.294465" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:00.294838" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:00.295004" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:00.293523" 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-07T17:16:00.295179" elapsed="0.000163"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.295825" 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-07T17:16:00.295499" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.296253" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:00.296017" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.296649" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:00.296419" elapsed="0.000255"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.299116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.298755" elapsed="0.000388"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:00.299187" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.299357" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:00.298423" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.347731" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.347361" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.348507" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.348263" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.348678" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.347917" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.349261" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.348859" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.349581" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:00.349732" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:00.349444" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.350201" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.349906" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.351194" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.350915" elapsed="0.000324"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.351666" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.351395" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.352016" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.352218" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.352386" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.351873" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.351738" elapsed="0.000734"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:00.352514" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:00.352669" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:00.350602" elapsed="0.002091"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.350314" elapsed="0.002410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.352888" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.352749" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.350295" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.353544" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.353117" elapsed="0.000457"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.353623" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:00.346715" elapsed="0.007030"/>
</kw>
<msg time="2026-04-07T17:16:00.353798" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.334963" elapsed="0.018940"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.365708" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.377367" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.389061" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.389460" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.389840" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.390359" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.390220" elapsed="0.000228"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:00.390206" elapsed="0.000266"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.390609" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.390772" 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-07T17:16:00.390932" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.390176" elapsed="0.000826"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.390042" elapsed="0.000998"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.391353" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.391509" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:00.391706" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:00.329525" elapsed="0.062231"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.394102" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.393833" elapsed="0.000333">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.394359" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.393412" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.394870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.394543" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.395558" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.395261" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.395031" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.394502" elapsed="0.001197"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.398239" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.396018" elapsed="0.002267"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:00.398381" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:00.398663" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.392596" elapsed="0.006115"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.401012" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.400755" elapsed="0.000320">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.401270" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.400341" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:00.401678" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.401457" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.401414" elapsed="0.000423"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.402270" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.402647" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.402792" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.404790" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.399519" elapsed="0.005322"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.408408" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.408081" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.409171" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.408828" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.430172" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.431091" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:00.431550" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.411505" elapsed="0.020105"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.409399" elapsed="0.022365"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.432396" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.431899" elapsed="0.000692"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.409358" elapsed="0.023356"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.439429" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.435932" elapsed="0.003781"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.435584" elapsed="0.004179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.435530" elapsed="0.004268"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.443181" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.440204" elapsed="0.003039"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.439877" elapsed="0.003413"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.439853" elapsed="0.003471"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.444078" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.443540" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.444533" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.444214" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.445381" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.444920" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.444649" elapsed="0.000818"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.444189" elapsed="0.001308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.446232" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.445708" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.446681" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.446366" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.447462" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.447023" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.446791" elapsed="0.000763"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.446341" elapsed="0.001249"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.447804" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.448594" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.448320" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.448766" elapsed="0.002126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.434281" elapsed="0.016783"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.451411" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.451219" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.451172" elapsed="0.000361"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.457505" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.451828" elapsed="0.005726"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.457650" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:16:00.457939" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.405634" elapsed="0.052370"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.458227" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:00.458485" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.307213" elapsed="0.151299"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.458840" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.458594" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.458577" elapsed="0.000765"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.459376" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:00.303268" elapsed="0.156232"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.299454" elapsed="0.160088"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.299436" elapsed="0.160130"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.460249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.460142" elapsed="0.000151"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:00.460414" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.460315" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.460124" elapsed="0.000369"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.460631" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:16:00.460748" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:00.459821" elapsed="0.000952"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.461317" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.460931" elapsed="0.000412"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.461950" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.461492" elapsed="0.000500"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.467759" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.467230" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.468640" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.468110" elapsed="0.000609"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.483529" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.483675" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10,"SnapshotIndex":21,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":21,"Leader":"member-1-shard-default-operational","LastIndex":24,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":22,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":24,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.434","active":true,"matchIndex":22,"voting":true,"id":"member-3-shard-default-operational","nextIndex":23},{"timeSinceLastActivity":"00:00:00.434","active":true,"matchIndex":22,"voting":true,"id":"member-2-shard-default-operational","nextIndex":23}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.353 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":22,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48662},"timestamp":1775582160,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:00.483889" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.473387" elapsed="0.010571"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.468802" elapsed="0.015404"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.484493" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.484248" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.468783" elapsed="0.016069"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.490869" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":10,"SnapshotIndex":21,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":21,"Leader":"member-1-shard-default-operational","LastIndex":24,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":22,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":24,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.434","active":true,"matchIndex":22,"voting":true,"id":"member-3-shard-default-operational","nextIndex":23},{"timeSinceLastActivity":"00:00:00.434","active":true,"matchIndex":22,"voting":true,"id":"member-2-shard-default-operational","nextIndex":23}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.353 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":22,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":2,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48662},"timestamp":1775582160,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.487444" elapsed="0.003603"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.486746" elapsed="0.004415"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.486687" elapsed="0.004574"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.495314" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.492161" elapsed="0.003287"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.491464" elapsed="0.004080"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.491406" elapsed="0.004237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.497565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.496425" elapsed="0.001278"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.498617" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.497900" elapsed="0.000893"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.500048" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.499438" elapsed="0.000657"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.498887" elapsed="0.001279"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.497840" elapsed="0.002391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.501625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.500777" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.502371" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.501862" elapsed="0.000635"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.503411" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.502915" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.502564" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.501820" elapsed="0.001768"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.503894" elapsed="0.000644"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.505512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.504813" elapsed="0.000799"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.505871" elapsed="0.002424"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.485508" elapsed="0.022896"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.508647" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.508501" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.508482" elapsed="0.000300"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.512155" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.508923" elapsed="0.003261"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.512313" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:00.512475" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.462911" elapsed="0.049590"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.512558" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:00.512703" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.462199" elapsed="0.050529"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.513899" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.513421" elapsed="0.000506"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:00.513990" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:00.514163" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:00.512942" elapsed="0.001248"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.514536" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 22, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.514338" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.514907" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.514711" elapsed="0.000220"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:00.514991" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.515153" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:00.297818" elapsed="0.217365"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:00.515239" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:00.515381" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:00.297113" elapsed="0.218292"/>
</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-07T17:16:00.515695" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.515482" elapsed="0.000269"/>
</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="PASS" start="2026-04-07T17:16:00.515988" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.515774" elapsed="0.000441"/>
</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-07T17:16:00.516378" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.516238" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.515465" elapsed="0.000986"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:00.296930" elapsed="0.219545"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.518867" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.518526" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:00.518938" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:16:00.519111" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:00.518194" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.567387" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.566994" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.568178" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.567937" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.568334" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.567609" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.568900" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.568515" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.569231" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:00.569359" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:00.569095" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.569771" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.569532" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.570739" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.570489" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.571224" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.570934" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.571555" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.571750" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.571914" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.571430" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.571296" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:00.572058" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.572213" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:00.570178" elapsed="0.002067"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.569880" elapsed="0.002396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.572445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.572301" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.569861" elapsed="0.002659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.573091" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.572654" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.573165" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:00.566378" elapsed="0.006907"/>
</kw>
<msg time="2026-04-07T17:16:00.573336" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.554757" elapsed="0.018685"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.585201" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.596937" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.608507" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.608903" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.609309" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.609808" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.609668" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:00.609654" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.610037" 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-07T17:16:00.610201" 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-07T17:16:00.610359" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.609625" elapsed="0.000786"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.609492" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.610748" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.610903" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.611133" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:00.549274" elapsed="0.061909"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.613497" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.613257" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.613749" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.612825" elapsed="0.000968"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.614298" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.613931" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.614935" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.614638" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.614434" elapsed="0.000622"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.613890" elapsed="0.001221"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.617593" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.615411" elapsed="0.002228"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:00.617733" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:00.618074" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.612024" elapsed="0.006100"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.620420" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.620182" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.620674" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.619754" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:00.621097" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.620856" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.620815" elapsed="0.000440"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.621551" elapsed="0.000060"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.621930" elapsed="0.000170"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.622194" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.624215" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.618930" elapsed="0.005336"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.627721" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.627393" elapsed="0.000423"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.628475" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.628154" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.662077" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.662992" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:00.663441" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.630776" elapsed="0.032725"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.628703" elapsed="0.034955"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.664286" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.663795" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.628662" elapsed="0.035940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.672444" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.667868" elapsed="0.004777"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.667388" elapsed="0.005294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.667344" elapsed="0.005363"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.675138" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.673019" elapsed="0.002165"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.672762" elapsed="0.002455"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.672745" elapsed="0.002496"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.675768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.675394" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.676120" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.675863" elapsed="0.000316"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.676651" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.676355" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.676202" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.675845" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.677262" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.676885" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.677581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.677357" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.678120" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.677812" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.677661" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.677339" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.678344" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.679150" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.678850" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.679322" elapsed="0.002132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.666150" elapsed="0.015453"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.681933" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.681745" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.681704" elapsed="0.000376"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.688165" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.682372" elapsed="0.005842"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.688310" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:00.688594" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.625003" elapsed="0.063641"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.688864" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.689131" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.526991" elapsed="0.162167"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.689487" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.689241" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.689224" elapsed="0.000720"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.689991" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:00.523083" elapsed="0.167034"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.519202" elapsed="0.170957"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.519185" elapsed="0.170998"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.690840" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.690722" elapsed="0.000168"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:00.691086" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.690936" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.690702" elapsed="0.000470"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.691318" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:16:00.691442" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:00.690434" elapsed="0.001036"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.692052" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.691642" elapsed="0.000439"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.692726" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.692243" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.698682" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.698142" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.699666" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.699114" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.715194" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.715297" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":25,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":25,"Leader":"member-1-shard-default-operational","LastIndex":26,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":26,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":26,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"565.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":26,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48744},"timestamp":1775582160,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:00.715448" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.704563" elapsed="0.010934"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.699837" elapsed="0.015988"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.716327" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.715888" elapsed="0.000914"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.699817" elapsed="0.017039"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.724870" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":25,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":25,"Leader":"member-1-shard-default-operational","LastIndex":26,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":26,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":26,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"565.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":26,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48744},"timestamp":1775582160,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.721094" elapsed="0.003918"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.719863" elapsed="0.005220"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.719772" elapsed="0.005379"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.727955" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.725768" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.725295" elapsed="0.002839"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.725254" elapsed="0.002948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.729596" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.728738" elapsed="0.000955"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.730335" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.729831" elapsed="0.000630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.731374" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.730886" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.730528" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.729790" elapsed="0.001763"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.732888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.732112" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.733688" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.733187" elapsed="0.000626"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.734725" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.734250" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.733881" elapsed="0.000960"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.733146" elapsed="0.001786"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.735260" elapsed="0.000636"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.736791" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.736185" elapsed="0.000707"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.737222" elapsed="0.002491"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.717872" elapsed="0.021949"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.740080" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.739918" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.739899" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.743539" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.740358" elapsed="0.003211"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.743668" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:00.743826" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.693743" elapsed="0.050109"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.743940" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:16:00.744106" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.692986" elapsed="0.051146"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.745303" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.744678" elapsed="0.000654"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:00.745380" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:00.745550" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:00.744346" elapsed="0.001231"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.745922" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 26, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.745726" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:00.746313" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.746115" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:00.746384" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:00.746529" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:00.517576" elapsed="0.228977"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:00.746608" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:00.746752" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:00.516789" elapsed="0.229992"/>
</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="PASS" start="2026-04-07T17:16:00.747112" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.746886" elapsed="0.000454"/>
</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-07T17:16:00.747503" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.747365" 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-07T17:16:00.747713" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.747579" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.746842" elapsed="0.000944"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:00.516628" elapsed="0.231182"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.750207" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.749851" elapsed="0.000383"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:00.750278" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.750422" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:00.749519" elapsed="0.000928"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.799804" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.799436" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.800546" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.800327" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.800741" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.800001" elapsed="0.000764"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.801319" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.800923" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.801640" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:00.801794" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:00.801500" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.802227" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.801984" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.803230" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.802962" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.803685" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.803425" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.804034" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.804231" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.804396" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.803891" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.803759" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:00.804524" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.804679" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:00.802617" elapsed="0.002087"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.802337" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.804901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.804760" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.802318" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.805549" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.805128" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.805626" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:00.798825" elapsed="0.006922"/>
</kw>
<msg time="2026-04-07T17:16:00.805799" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.787211" elapsed="0.018695"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.842896" elapsed="0.000119"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.855312" elapsed="0.000089"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.867294" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.867708" elapsed="0.000057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.868121" elapsed="0.000057"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.868669" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.868523" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:00.868504" elapsed="0.000249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.868888" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.869066" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.869229" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:00.868465" elapsed="0.000816"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.868316" elapsed="0.001006"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.869625" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.869788" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:00.870042" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:00.781762" elapsed="0.088333"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.872609" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.872306" elapsed="0.000378">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.872881" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.871810" elapsed="0.001116"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.873470" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.873125" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.874144" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.873824" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.873610" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.873084" elapsed="0.001200"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.876817" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:00.874584" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:00.876956" elapsed="0.000122"/>
</return>
<msg time="2026-04-07T17:16:00.877304" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.870944" elapsed="0.006409"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:00.879637" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:00.879396" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:00.879929" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:00.878984" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:00.880353" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.880131" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.880089" elapsed="0.000421"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.880810" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.881292" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.881437" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.883478" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:00.878147" elapsed="0.005382"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.887082" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.886707" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.887832" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.887505" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.921502" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.922461" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:00.922949" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.890189" elapsed="0.032849"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.888201" elapsed="0.034992"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.923780" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.923328" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.888159" elapsed="0.035983"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.932420" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.927503" elapsed="0.005120"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.927006" elapsed="0.005654"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.926931" elapsed="0.005754"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.935126" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.932960" elapsed="0.002212"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.932742" elapsed="0.002465"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.932724" elapsed="0.002508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.935769" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.935387" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.936112" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.935866" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.936672" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.936348" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.936195" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.935848" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.937291" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.936905" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.937614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.937388" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.938162" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.937850" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.937696" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.937369" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.938389" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.939205" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.938901" elapsed="0.000329"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.939378" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.925681" elapsed="0.015960"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.941992" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.941781" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.941740" elapsed="0.000379"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.948216" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.942415" elapsed="0.005851"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.948363" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:16:00.948656" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.884340" elapsed="0.064367"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.948931" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:00.949202" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.759565" elapsed="0.189664"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.949630" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.949312" elapsed="0.000780"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.949295" elapsed="0.000827"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.950155" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:00.755495" elapsed="0.194785"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.750513" elapsed="0.199810"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.750496" elapsed="0.199850"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.951023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.950882" elapsed="0.000187"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:00.951193" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:00.951091" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.950864" elapsed="0.000409"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.951412" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:16:00.951530" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:00.950603" elapsed="0.000952"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.952097" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.951713" elapsed="0.000411"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.952726" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.952274" elapsed="0.000478"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.958611" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.958069" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.959484" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.958869" elapsed="0.000695"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:00.972135" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:00.972239" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":25,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":25,"Leader":"member-1-shard-default-operational","LastIndex":26,"RaftState":"Follower","LastApplied":26,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":26,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"517.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":26,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48744},"timestamp":1775582160,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:00.972390" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:00.964260" elapsed="0.008179"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.959647" elapsed="0.012943"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.972794" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.972619" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.959628" elapsed="0.013417"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.978158" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":25,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":25,"Leader":"member-1-shard-default-operational","LastIndex":26,"RaftState":"Follower","LastApplied":26,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":26,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"517.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":26,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":48744},"timestamp":1775582160,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.974914" elapsed="0.003397"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.974377" elapsed="0.004029"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.974335" elapsed="0.004166"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.982600" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:00.979420" elapsed="0.003329"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.978733" elapsed="0.004110"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.978643" elapsed="0.004295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.984829" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.983711" elapsed="0.001254"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.985866" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.985183" elapsed="0.000880"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.987357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.986673" elapsed="0.000749"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.986158" elapsed="0.001361"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.985125" elapsed="0.002503"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.989079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.988284" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:00.989806" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:00.989316" elapsed="0.000614"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:00.990855" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:00.990365" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:00.990016" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.989274" elapsed="0.001779"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:00.991356" elapsed="0.000720"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:00.992946" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:00.992349" elapsed="0.000711"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:00.993318" elapsed="0.002391"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:00.973493" elapsed="0.022324"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:00.996154" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:00.995912" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:00.995893" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:00.999462" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:00.996432" elapsed="0.003059"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:00.999590" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:16:00.999752" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:00.953703" elapsed="0.046075"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:00.999866" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.000164" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:00.952959" elapsed="0.047232"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.001243" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.000740" elapsed="0.000531"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:01.001319" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.001492" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558216...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:01.000408" elapsed="0.001111"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.001866" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 26, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.001668" elapsed="0.000224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.002253" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.002056" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:01.002323" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.002471" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:00.748857" elapsed="0.253638"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:01.002551" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:01.002708" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:00.748155" elapsed="0.254577"/>
</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="PASS" start="2026-04-07T17:16:01.003055" elapsed="0.000196"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.002810" elapsed="0.000478"/>
</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-07T17:16:01.003452" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.003312" 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-07T17:16:01.003663" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.003529" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.002793" elapsed="0.000943"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:00.747990" elapsed="0.255769"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:00.296724" elapsed="0.707066"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.003830" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:01.004120" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:01.004166" level="INFO">${follower_list} = [2, 3]</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-07T17:16:00.292804" elapsed="0.711385"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.004646" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:01.004736" level="INFO">${leader_count} = 1</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-07T17:16:01.004356" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.005058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.004837" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.004820" elapsed="0.000316"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.007169" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:01.005264" elapsed="0.001951"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:01.007602" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.007411" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.007674" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:16:00.290365" elapsed="0.717462"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:16:00.290141" elapsed="0.717732"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:15:56.632989" elapsed="4.374914"/>
</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="PASS" start="2026-04-07T17:15:56.632586" elapsed="4.375368"/>
</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-07T17:16:01.013004" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.012595" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.013486" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.013188" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:01.013556" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.013708" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.012151" elapsed="0.001581"/>
</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-07T17:16:01.013881" elapsed="0.000171"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.014535" 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-07T17:16:01.014206" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.014999" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.014738" elapsed="0.000288"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.015404" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.015169" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.017830" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.017488" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:01.017902" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.018071" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:01.017156" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.066883" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.066477" elapsed="0.000434"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.067648" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.067416" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.067807" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.067087" elapsed="0.000745"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.068388" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.068006" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.068708" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:01.068903" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:01.068571" elapsed="0.000358"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.069342" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.069097" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.070322" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.070069" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.070805" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.070521" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.071154" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.071354" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.071522" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.071025" elapsed="0.000554"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.070878" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:01.071649" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.071804" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:01.069741" elapsed="0.002088"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.069454" elapsed="0.002406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.072043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.071885" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.069435" elapsed="0.002685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.072697" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.072257" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.072772" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.065858" elapsed="0.007035"/>
</kw>
<msg time="2026-04-07T17:16:01.072947" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.054023" elapsed="0.019047"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.084962" elapsed="0.000083"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.096628" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.108283" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.108709" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.109113" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.109613" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.109472" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:01.109458" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.109829" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.110010" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.110174" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.109428" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.109294" elapsed="0.000970"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.110590" elapsed="0.000057"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.110747" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.110937" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:01.048550" elapsed="0.062452"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.113329" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.113078" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.113591" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.112628" elapsed="0.001009"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.114160" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.113777" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.114823" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.114510" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.114299" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.113735" elapsed="0.001227"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.117465" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.115283" elapsed="0.002227"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:01.117603" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:01.117884" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.111822" elapsed="0.006111"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.120393" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.120154" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.120650" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.119728" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:01.121075" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.120835" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.120794" elapsed="0.000442"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.121538" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.121953" elapsed="0.000164"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.122210" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.124226" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.118899" elapsed="0.005378"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.127807" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.127479" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.128570" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.128245" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.146090" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.147013" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:01.147449" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.130905" elapsed="0.016601"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.128802" elapsed="0.018857"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.148287" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.147795" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.128760" elapsed="0.019856"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.155395" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.151871" elapsed="0.003869"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.151484" elapsed="0.004307"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.151438" elapsed="0.004388"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.159187" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.156230" elapsed="0.003019"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.155904" elapsed="0.003393"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.155881" elapsed="0.003450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.160077" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.159543" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.160529" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.160212" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.161309" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.160854" elapsed="0.000490"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.160643" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.160187" elapsed="0.001236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.162158" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.161633" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.162636" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.162292" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.163389" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.162960" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.162750" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.162266" elapsed="0.001238"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.163708" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.164493" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.164224" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.164666" elapsed="0.002114"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.150190" elapsed="0.016738"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.167280" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.167091" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.167049" elapsed="0.000352"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.173460" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.167698" elapsed="0.005810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.173606" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:16:01.173896" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.125028" elapsed="0.048918"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.174182" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.174438" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.025940" elapsed="0.148525"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.174822" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.174572" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.174554" elapsed="0.000819"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.175407" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:01.022028" elapsed="0.153505"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.018165" elapsed="0.157410"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.018146" elapsed="0.157454"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:01.176239" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.176133" elapsed="0.000164"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.176357" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.176320" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.176115" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.176555" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:16:01.176671" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:01.175853" elapsed="0.000842"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.177233" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.176853" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.177861" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.177409" elapsed="0.000479"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.184156" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.183601" elapsed="0.000637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.184933" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.184402" elapsed="0.000628"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.199745" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.199847" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":1,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":1,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.101","active":true,"matchIndex":1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":2},{"timeSinceLastActivity":"00:00:00.101","active":true,"matchIndex":1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":2}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"872.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:01.200024" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.189750" elapsed="0.010325"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.185114" elapsed="0.015115"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.200437" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.200259" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.185095" elapsed="0.015576"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.206728" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":1,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":1,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":1,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.101","active":true,"matchIndex":1,"voting":true,"id":"member-2-shard-topology-config","nextIndex":2},{"timeSinceLastActivity":"00:00:00.101","active":true,"matchIndex":1,"voting":true,"id":"member-3-shard-topology-config","nextIndex":2}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"872.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.202593" elapsed="0.004416"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.202087" elapsed="0.005082"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.202044" elapsed="0.005277"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.213855" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.208744" elapsed="0.005360"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.207644" elapsed="0.006614"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.207552" elapsed="0.006859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.216525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.215721" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.217317" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.216763" elapsed="0.000678"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.218348" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.217862" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.217509" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.216721" elapsed="0.001817"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.219887" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.219115" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.220634" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.220140" elapsed="0.000616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.221657" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.221191" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.220823" elapsed="0.000947"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.220098" elapsed="0.001737"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.222152" elapsed="0.000648"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.223687" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.223083" elapsed="0.000702"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.224176" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.201189" elapsed="0.025572"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.227017" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.226857" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.226838" elapsed="0.000315"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.230542" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.227294" elapsed="0.003281"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.230674" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.230861" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.179114" elapsed="0.051774"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.230945" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:01.231109" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.178110" elapsed="0.053025"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.232191" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.231685" elapsed="0.000534"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:01.232266" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.232441" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:01.231348" elapsed="0.001120"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.232816" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'id...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.232615" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.233281" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.233082" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:01.233353" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.233500" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:01.016548" elapsed="0.216976"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:01.233580" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:01.233730" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:01.015832" elapsed="0.217922"/>
</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-07T17:16:01.234055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.233832" elapsed="0.000280"/>
</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="PASS" start="2026-04-07T17:16:01.234336" elapsed="0.000209"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.234136" elapsed="0.000453"/>
</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-07T17:16:01.234754" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.234614" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.233815" elapsed="0.001014"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:01.015670" elapsed="0.219182"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.237363" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.236820" elapsed="0.000570"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:01.237435" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.237583" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:01.236482" elapsed="0.001126"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.285861" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.285398" elapsed="0.000491"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.286673" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.286454" elapsed="0.000282">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.286827" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.286073" elapsed="0.000779"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.287407" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.287027" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.287723" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:01.287847" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:01.287587" elapsed="0.000285"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.288280" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.288037" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.289258" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.289004" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.289712" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.289454" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.290060" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.290259" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.290435" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.289919" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.289786" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:01.290563" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.290719" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:01.288675" elapsed="0.002069"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.288390" elapsed="0.002386"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.290942" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.290800" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.288371" elapsed="0.002668"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.291597" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.291176" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.291671" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.284782" elapsed="0.007009"/>
</kw>
<msg time="2026-04-07T17:16:01.291843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.273100" elapsed="0.018850"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.303737" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.315333" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.327014" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.327414" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.327801" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.328319" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.328179" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:01.328164" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.328536" 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-07T17:16:01.328698" 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-07T17:16:01.328859" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.328135" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.328001" elapsed="0.000946"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.329375" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.329534" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.329727" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:01.267693" elapsed="0.062084"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.332452" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.332206" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.332722" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.331760" elapsed="0.001008"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.333257" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.332908" elapsed="0.000438"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.333912" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.333613" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.333404" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.332867" elapsed="0.001200"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.336608" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.334381" elapsed="0.002272"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:01.336748" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:01.337044" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.330840" elapsed="0.006254"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.339392" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.339145" elapsed="0.000309">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.339646" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.338720" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:01.340174" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.339830" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.339788" elapsed="0.000547"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.340631" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.341020" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.341166" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.344125" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.337863" elapsed="0.006313"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.347619" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.347291" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.348481" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.348157" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.379831" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.380422" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:01.380735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.350689" elapsed="0.030084"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.348710" elapsed="0.032160"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.381297" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.380955" elapsed="0.000464"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.348669" elapsed="0.032828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.387181" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.383585" elapsed="0.003883"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.383278" elapsed="0.004244"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.383249" elapsed="0.004316"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.390938" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.388004" elapsed="0.002994"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.387663" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.387633" elapsed="0.003424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.391590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.391215" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.391914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.391686" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.392464" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.392167" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.392012" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.391667" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.393072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.392698" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.393395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.393169" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.393923" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.393627" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.393475" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.393150" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.394168" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.394980" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.394690" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.395157" elapsed="0.002098"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.382484" elapsed="0.014925"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.397748" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.397550" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.397508" elapsed="0.000366"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.403855" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.398196" elapsed="0.005709"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.404017" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:16:01.404312" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.344908" elapsed="0.059455"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.404589" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.404850" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.245341" elapsed="0.159536"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.405226" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.404960" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.404943" elapsed="0.000769"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.405746" elapsed="0.000026"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:01.241425" elapsed="0.164445"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.237675" elapsed="0.168237"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.237658" elapsed="0.168278"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:01.406593" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.406486" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.406713" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.406675" elapsed="0.000078"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.406469" elapsed="0.000306"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.406918" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:16:01.407066" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:01.406209" elapsed="0.000883"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.407621" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.407254" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.408276" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.407799" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.414376" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.413779" elapsed="0.000681"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.415248" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.414628" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.428245" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.428348" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":1,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"503.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:01.428507" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.420099" elapsed="0.008463"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.415413" elapsed="0.013306"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.428928" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.428749" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.415394" elapsed="0.013782"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.433311" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":1,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"503.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.431075" elapsed="0.002411"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.430540" elapsed="0.003014"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.430499" elapsed="0.003123"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.437332" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.434258" elapsed="0.003204"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.433765" elapsed="0.003791"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.433725" elapsed="0.003926"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.439671" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.438449" elapsed="0.001362"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.440738" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.440028" elapsed="0.000888"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.442319" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.441580" elapsed="0.000808"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.441081" elapsed="0.001403"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.439947" elapsed="0.002628"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.444489" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.443375" elapsed="0.001254"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.445539" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.444825" elapsed="0.000890"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.447137" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.446494" elapsed="0.000689"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.445809" elapsed="0.001443"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.444767" elapsed="0.002551"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.447628" elapsed="0.000645"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.449166" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.448543" elapsed="0.000722"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.449527" elapsed="0.002466"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.429644" elapsed="0.022460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.452353" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.452206" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.452187" elapsed="0.000306"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.455758" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.452634" elapsed="0.003153"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.455887" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.456062" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.409444" elapsed="0.046645"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.456146" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:01.456293" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.408514" elapsed="0.047805"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.457367" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.456867" elapsed="0.000528"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:01.457478" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.457659" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:01.456535" elapsed="0.001151"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.458159" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.457837" elapsed="0.000350"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.458566" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.458362" elapsed="0.000230"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:01.458641" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.458790" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:01.235878" elapsed="0.222937"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:01.458871" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:01.459032" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:01.235182" elapsed="0.223875"/>
</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="PASS" start="2026-04-07T17:16:01.459347" elapsed="0.000392"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.459135" elapsed="0.000643"/>
</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-07T17:16:01.459946" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.459803" 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-07T17:16:01.460181" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.460042" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.459118" elapsed="0.001137"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:01.235020" elapsed="0.225259"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.462682" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.462339" elapsed="0.000369"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:01.462753" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.462899" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:01.461935" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.511646" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.511269" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.512409" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.512177" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.512572" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.511831" elapsed="0.000765"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.513156" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.512757" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.513472" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:01.513611" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:01.513337" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.514086" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.513822" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.515103" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.514833" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.515562" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.515300" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.515899" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.516112" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.516282" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.515772" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.515637" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:01.516413" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.516569" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:01.514514" elapsed="0.002080"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.514197" elapsed="0.002427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.516789" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.516649" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.514178" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.517450" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.517018" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.517524" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.510647" elapsed="0.006998"/>
</kw>
<msg time="2026-04-07T17:16:01.517696" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.498730" elapsed="0.019072"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.529436" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.541084" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.553022" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.553425" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.553811" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.554385" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.554241" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:01.554225" elapsed="0.000241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.554603" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.554767" 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-07T17:16:01.554928" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.554194" elapsed="0.000804"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.554048" elapsed="0.000989"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.555341" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.555496" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.555689" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:01.493218" elapsed="0.062521"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.558089" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.557827" elapsed="0.000325">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.558369" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.557405" elapsed="0.001012"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.558887" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.558557" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.559549" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.559250" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.559041" elapsed="0.000595"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.558515" elapsed="0.001177"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.562253" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.560012" elapsed="0.002287"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:01.562393" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:01.562677" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.556585" elapsed="0.006142"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.565015" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.564760" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.565275" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.564347" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:01.565685" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.565463" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.565422" elapsed="0.000423"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.566286" elapsed="0.000057"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.566668" elapsed="0.000056"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.566827" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.568737" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.563524" elapsed="0.005262"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.572350" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.571924" elapsed="0.000521"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.573115" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.572773" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.600086" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.600635" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:01.600918" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.575712" elapsed="0.025242"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.573347" elapsed="0.027734"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.601447" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.601165" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.573302" elapsed="0.028343"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.607268" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.603717" elapsed="0.003829"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.603408" elapsed="0.004187"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.603379" elapsed="0.004252"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.611050" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.608031" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.607708" elapsed="0.003422"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.607685" elapsed="0.003470"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.611683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.611309" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.612083" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.611778" elapsed="0.000364"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.612616" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.612320" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.612166" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.611760" elapsed="0.000940"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.613227" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.612852" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.613549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.613322" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.614092" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.613784" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.613630" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.613304" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.614334" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.615124" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.614837" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.615299" elapsed="0.002121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.602631" elapsed="0.014938"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.617900" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.617710" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.617669" elapsed="0.000380"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.624006" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.618362" elapsed="0.005693"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.624151" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:01.624437" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.569526" elapsed="0.054962"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.624713" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.624963" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.470765" elapsed="0.154240"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.625340" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.625089" elapsed="0.000681"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.625072" elapsed="0.000726"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.625831" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:01.466834" elapsed="0.159121"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.463006" elapsed="0.163007"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.462988" elapsed="0.163051"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:01.626691" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.626580" elapsed="0.000170"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.626809" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.626773" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.626563" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.627043" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:16:01.627163" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:01.626312" elapsed="0.000877"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.627717" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.627350" elapsed="0.000394"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.628368" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.627894" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.634388" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.633817" elapsed="0.000652"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.635250" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.634633" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.647518" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.647620" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Follower","LastApplied":1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"440.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:01.647770" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.639983" elapsed="0.007837"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.635416" elapsed="0.012571"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.648196" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.648018" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.635396" elapsed="0.013034"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.652552" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":0,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":0,"Leader":"member-1-shard-topology-config","LastIndex":1,"RaftState":"Follower","LastApplied":1,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":1,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"440.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":1,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":210},"timestamp":1775582161,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.650284" elapsed="0.002409"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.649768" elapsed="0.002996"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.649726" elapsed="0.003107"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.656237" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.653477" elapsed="0.002896"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.652992" elapsed="0.003477"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.652936" elapsed="0.003630"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.658494" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.657347" elapsed="0.001286"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.659547" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.658828" elapsed="0.000899"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.661051" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.660364" elapsed="0.000752"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.659823" elapsed="0.001390"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.658770" elapsed="0.002535"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.663212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.662085" elapsed="0.001265"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.664286" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.663545" elapsed="0.000916"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.665725" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.665066" elapsed="0.000724"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.664557" elapsed="0.001329"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.663487" elapsed="0.002510"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.666457" elapsed="0.000759"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.668232" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.667487" elapsed="0.000844"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.668594" elapsed="0.002656"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.648881" elapsed="0.022479"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.671607" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.671457" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.671437" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.675028" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.671884" elapsed="0.003173"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.675160" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.675317" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.629337" elapsed="0.046006"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.675399" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:01.675543" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.628607" elapsed="0.046962"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.676688" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.676212" elapsed="0.000504"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:01.676813" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.677004" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:01.675787" elapsed="0.001245"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.677380" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 1, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitialS...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.677183" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.677752" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.677555" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:01.677824" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.677987" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:01.461332" elapsed="0.216681"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:01.678070" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:16:01.678244" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:01.460604" elapsed="0.217665"/>
</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="PASS" start="2026-04-07T17:16:01.678556" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.678347" elapsed="0.000433"/>
</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-07T17:16:01.678943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.678804" 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-07T17:16:01.679174" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.679038" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.678329" elapsed="0.000918"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:01.460439" elapsed="0.218831"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.015474" elapsed="0.663826"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.679340" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:01.679536" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:01.679583" level="INFO">${follower_list} = [2, 3]</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-07T17:16:01.011434" elapsed="0.668172"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.680280" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:01.680358" level="INFO">${leader_count} = 1</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-07T17:16:01.679774" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.680662" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.680452" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.680433" elapsed="0.000306"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.682705" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:01.680869" elapsed="0.001883"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:01.683111" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.682910" elapsed="0.000226"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.683183" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:16:01.008987" elapsed="0.674348"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:16:01.008756" elapsed="0.674625"/>
</iter>
<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-07T17:16:01.687627" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.687246" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.688169" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.687845" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:01.688240" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.688392" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.686869" 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-07T17:16:01.688564" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.689223" 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-07T17:16:01.688873" elapsed="0.000376"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.689640" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.689403" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.690057" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:01.689808" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.692500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.692161" elapsed="0.000365"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:01.692571" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.692715" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:01.691813" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.740953" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.740585" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.741707" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.741477" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.741862" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.741154" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.742448" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.742070" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.742760" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:01.742899" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:01.742628" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.743336" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.743094" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.744328" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.744076" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.744788" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.744523" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.745136" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.745332" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.745498" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.745007" elapsed="0.000601"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.744860" elapsed="0.000779"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:01.745682" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.745839" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:01.743731" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.743446" elapsed="0.002449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.746088" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.745919" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.743427" elapsed="0.002741"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.746726" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.746305" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.746801" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.739986" elapsed="0.006936"/>
</kw>
<msg time="2026-04-07T17:16:01.746988" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.728355" elapsed="0.018744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.758902" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.770521" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.782197" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.782595" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.783000" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.783502" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.783361" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:01.783347" elapsed="0.000253"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.783737" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.783898" 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-07T17:16:01.784073" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.783318" elapsed="0.000809"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.783186" elapsed="0.000977"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.784465" elapsed="0.000057"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.784665" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:01.784858" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:01.722934" elapsed="0.061974"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.787276" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.787028" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.787531" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.786600" elapsed="0.000976"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.788098" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.787717" elapsed="0.000463"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.788742" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.788446" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.788239" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.787675" elapsed="0.001207"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.791393" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.789199" elapsed="0.002240"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:01.791534" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:16:01.791823" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.785753" elapsed="0.006120"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.794256" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.794016" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.794513" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.793587" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:01.794918" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.794698" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.794657" elapsed="0.000439"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.795396" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.795773" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.795919" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.798045" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:01.792765" elapsed="0.005336"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.801588" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.801257" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.802347" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.802024" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.819702" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.820637" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:01.821138" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.804699" elapsed="0.016499"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.802574" elapsed="0.018774"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.821925" elapsed="0.000112"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.821481" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.802534" elapsed="0.019775"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.829528" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.825570" elapsed="0.004253"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.825079" elapsed="0.004794"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.825032" elapsed="0.004876"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.833344" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.830338" elapsed="0.003068"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.830029" elapsed="0.003424"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.829962" elapsed="0.003525"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.834253" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.833700" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.834705" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.834388" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.835473" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.835063" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.834818" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.834362" elapsed="0.001246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.836366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.835846" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.836811" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.836499" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.837565" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.837156" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.836923" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.836474" elapsed="0.001203"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.837876" elapsed="0.001060"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.839387" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.839112" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.839562" elapsed="0.002120"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.823822" elapsed="0.018009"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.842198" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.842006" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.841929" elapsed="0.000390"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.848400" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.842612" elapsed="0.005837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.848544" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:01.848828" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.798857" elapsed="0.050021"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.849115" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:01.849367" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.700616" elapsed="0.148777"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.849723" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.849477" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.849460" elapsed="0.000761"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.850255" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:01.696649" elapsed="0.153730"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.692806" elapsed="0.157616"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.692788" elapsed="0.157657"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:01.851104" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:01.850955" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.851222" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.851185" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.850938" elapsed="0.000345"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.851421" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:16:01.851539" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:01.850694" elapsed="0.000870"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.852109" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.851729" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.852734" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.852285" elapsed="0.000476"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.858664" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.858122" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.859531" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.858910" elapsed="0.000702"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:01.870806" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:01.870909" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.265","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.263","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"735.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582161,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:01.871284" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:01.864323" elapsed="0.007011"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.859695" elapsed="0.011790"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.871694" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.871514" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.859677" elapsed="0.012247"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.878206" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.265","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.263","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"735.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582161,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.873773" elapsed="0.004588"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.873296" elapsed="0.005159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.873255" elapsed="0.005294"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.882500" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.879441" elapsed="0.003191"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.878747" elapsed="0.003978"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.878691" elapsed="0.004128"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.884813" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.883710" elapsed="0.001239"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.885848" elapsed="0.000109"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.885165" elapsed="0.000916"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.887167" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.886632" elapsed="0.000580"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.886176" elapsed="0.001107"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.885107" elapsed="0.002240"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.888668" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.887882" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.889411" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.888905" elapsed="0.000631"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.890447" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.889979" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.889603" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.888863" elapsed="0.001763"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.890930" elapsed="0.000654"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:01.892468" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.891850" elapsed="0.000734"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.892850" elapsed="0.002537"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:01.872416" elapsed="0.023079"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.895736" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:01.895592" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.895573" elapsed="0.000299"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:01.899417" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:01.896027" elapsed="0.003419"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:01.899546" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.899739" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:01.853695" elapsed="0.046071"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.899822" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:01.899983" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.852964" elapsed="0.047046"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.901071" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.900556" elapsed="0.000543"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:01.901148" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.901324" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582161, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:01.900225" elapsed="0.001125"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.901700" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.901499" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:01.902103" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.901876" elapsed="0.000251"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:01.902173" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.902319" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:01.691226" elapsed="0.211117"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:01.902397" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:01.902538" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:01.690512" elapsed="0.212049"/>
</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-07T17:16:01.902846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.902638" elapsed="0.000264"/>
</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="PASS" start="2026-04-07T17:16:01.903193" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.902926" elapsed="0.000499"/>
</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-07T17:16:01.903594" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.903450" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.902621" elapsed="0.001047"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:01.690351" elapsed="0.213340"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.906028" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.905648" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:01.906100" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:01.906245" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:01.905320" elapsed="0.000949"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.954911" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:01.954541" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.955696" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:01.955479" elapsed="0.000283">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:01.955853" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:01.955114" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.956430" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:01.956052" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:01.956750" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:01.956944" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:01.956615" elapsed="0.000372"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.957382" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.957141" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.958384" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:01.958133" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.958841" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:01.958581" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.959191" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.959389" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.959556" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.959063" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.958916" elapsed="0.000725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:01.959683" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:01.959835" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:01.957773" elapsed="0.002087"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.957493" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.960073" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.959916" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.957474" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:01.960712" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:01.960289" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:01.960786" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:01.953926" elapsed="0.006979"/>
</kw>
<msg time="2026-04-07T17:16:01.960958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:01.942224" elapsed="0.018857"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.973000" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.984759" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.996492" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.996889" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.997295" elapsed="0.000058"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.997799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:01.997658" elapsed="0.000593"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:01.997643" elapsed="0.000635"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.998421" 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-07T17:16:01.998586" 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-07T17:16:01.998748" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:01.997614" elapsed="0.001187"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.997480" elapsed="0.001371"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:01.999187" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:01.999344" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:01.999537" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:01.936755" elapsed="0.062832"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.002063" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:02.001759" elapsed="0.000367">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:02.002321" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:02.001343" elapsed="0.001023"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.002840" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.002506" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.003495" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.003202" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.002992" elapsed="0.000587"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.002464" elapsed="0.001170"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.006188" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:02.003936" elapsed="0.002298"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:02.006331" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:02.006620" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:02.000491" elapsed="0.006177"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.009148" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:02.008881" elapsed="0.000330">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:02.009407" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:02.008470" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:02.009818" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.009597" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.009555" elapsed="0.000456"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.010312" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.010690" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.010834" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:02.012897" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:02.007536" elapsed="0.005411"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.016640" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.016311" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.017399" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.017075" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:02.043681" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:02.044587" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:02.045061" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:02.019612" elapsed="0.025510"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.017630" elapsed="0.027646"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.045878" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.045407" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.017588" elapsed="0.028648"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.054936" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.049530" elapsed="0.005661"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.049046" elapsed="0.006181"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.048996" elapsed="0.006255"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.057613" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.055524" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.055307" elapsed="0.002386"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.055290" elapsed="0.002427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.058287" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.057894" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.058611" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.058383" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.059162" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.058843" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.058691" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.058364" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.059750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.059396" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.060084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.059846" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.060608" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.060317" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.060166" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.059828" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.060832" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:02.061621" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.061348" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.061809" elapsed="0.002243"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:02.047773" elapsed="0.016432"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.064536" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.064345" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.064304" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:02.070744" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:02.064957" elapsed="0.005836"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:02.070889" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:02.071194" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:02.013701" elapsed="0.057543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.071462" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:02.071716" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:01.914313" elapsed="0.157430"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.072093" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.071828" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.071810" elapsed="0.000745"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.072589" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:01.910349" elapsed="0.162364"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:01.906335" elapsed="0.166420"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:01.906317" elapsed="0.166462"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:02.073417" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.073311" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.073536" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.073499" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.073294" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.073735" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:16:02.073882" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:02.073049" elapsed="0.000858"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.074453" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.074087" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.075100" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.074629" elapsed="0.000497"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.080907" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.080378" elapsed="0.000625"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.081694" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.081170" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:02.093454" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:02.093562" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:02 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"464.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582162,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:02.093711" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:02.086537" elapsed="0.007255"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.081874" elapsed="0.012076"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.094388" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.094207" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.081855" elapsed="0.012816"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.100586" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"464.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582162,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.097232" elapsed="0.003549"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.096553" elapsed="0.004323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.096495" elapsed="0.004500"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.105058" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.101883" elapsed="0.003309"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.101202" elapsed="0.004083"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.101145" elapsed="0.004239"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.107158" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.106185" elapsed="0.001071"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.107896" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.107397" elapsed="0.000656"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.108946" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.108473" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.108122" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.107353" elapsed="0.001792"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.110512" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.109692" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.111303" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.110788" elapsed="0.000641"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.112374" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.111852" elapsed="0.000650"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.111498" elapsed="0.001081"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.110746" elapsed="0.001899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.112950" elapsed="0.000654"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:02.114544" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.113903" elapsed="0.000739"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.114903" elapsed="0.002515"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:02.095328" elapsed="0.022199"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.117779" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.117623" elapsed="0.000267"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.117603" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:02.121287" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:02.118074" elapsed="0.003243"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:02.121416" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:02.121576" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:02.076059" elapsed="0.045543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.121658" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:02.121818" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:02.075331" elapsed="0.046513"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.122896" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582162, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.122415" elapsed="0.000510"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:02.123023" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:02.123202" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582162, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:02.122076" elapsed="0.001153"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.123580" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.123380" elapsed="0.000227"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.123957" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.123757" elapsed="0.000336"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:02.124141" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:02.124294" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:01.904718" elapsed="0.219600"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:02.124375" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:02.124518" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:01.904020" elapsed="0.220523"/>
</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="PASS" start="2026-04-07T17:16:02.124831" elapsed="0.000209"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.124621" elapsed="0.000457"/>
</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-07T17:16:02.125243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.125103" 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-07T17:16:02.125456" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.125321" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.124604" elapsed="0.000925"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:01.903843" elapsed="0.221711"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.127912" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.127572" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:02.128039" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:02.128188" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:02.127232" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.176431" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.176060" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.177189" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:02.176944" elapsed="0.000316">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:02.177351" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:02.176620" elapsed="0.000755"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.178073" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:02.177533" elapsed="0.000568"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.178416" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:02.178564" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:02.178278" elapsed="0.000344"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.179033" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.178775" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.180023" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.179755" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.180485" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.180222" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.180823" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.181039" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.181212" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:02.180697" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.180562" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:02.181341" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:02.181496" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:02.179439" elapsed="0.002082"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.179146" elapsed="0.002411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.181731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.181581" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.179127" elapsed="0.002682"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.182384" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.181945" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.182457" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:02.175444" elapsed="0.007133"/>
</kw>
<msg time="2026-04-07T17:16:02.182629" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.163754" elapsed="0.018981"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.194492" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.206081" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.217656" elapsed="0.000070"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.218175" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.218558" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.219118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.218956" elapsed="0.000220"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:02.218941" elapsed="0.000259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.219336" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.219499" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.219662" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:02.218911" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.218777" elapsed="0.000976"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.220072" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.220228" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:02.220418" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:02.158317" elapsed="0.062151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.222843" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:02.222585" elapsed="0.000322">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:02.223131" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:02.222165" elapsed="0.001011"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.223642" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.223315" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.224300" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.224003" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.223778" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.223274" elapsed="0.001168"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.226960" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:02.224753" elapsed="0.002313"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:02.227163" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:02.227446" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:02.221317" elapsed="0.006178"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:02.229861" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:02.229610" elapsed="0.000313">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:02.230138" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:02.229196" elapsed="0.000988"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:02.230551" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.230324" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.230283" elapsed="0.000428"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.231138" elapsed="0.000058"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.231521" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.231665" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:02.233719" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:02.228373" elapsed="0.005398"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.237282" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.236937" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.238064" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.237720" elapsed="0.000439"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:02.262345" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:02.263317" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:02.263772" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:02.240381" elapsed="0.023452"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.238294" elapsed="0.025728"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.264610" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.264162" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.238253" elapsed="0.026672"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.272160" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.268263" elapsed="0.004114"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.267738" elapsed="0.004675"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.267691" elapsed="0.004747"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.274843" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.272711" elapsed="0.002176"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.272494" elapsed="0.002427"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.272477" elapsed="0.002468"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.275481" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.275111" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.275802" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.275576" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.276347" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.276050" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.275883" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.275559" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.276935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.276579" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.277290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.277064" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.277937" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.277640" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.277371" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.277045" elapsed="0.000993"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.278180" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:02.278951" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.278677" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.279141" elapsed="0.002148"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:02.266492" elapsed="0.014943"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.281793" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.281574" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.281532" elapsed="0.000380"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:02.287983" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:02.282230" elapsed="0.005803"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:02.288128" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:02.288411" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:02.234528" elapsed="0.053933"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.288678" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:02.288930" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:02.136077" elapsed="0.152880"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.289305" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.289056" elapsed="0.000690"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.289039" elapsed="0.000735"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.289807" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:02.132162" elapsed="0.157768"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.128278" elapsed="0.161709"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.128261" elapsed="0.161751"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:02.290631" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.290527" elapsed="0.000162"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.290746" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.290711" elapsed="0.000073"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.290509" elapsed="0.000297"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.290943" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:16:02.291165" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:02.290267" elapsed="0.000922"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.291718" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.291349" elapsed="0.000395"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.292376" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.291893" elapsed="0.000509"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.298288" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.297738" elapsed="0.000630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.299073" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.298532" elapsed="0.000619"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:02.310730" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:02.310832" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:02 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:02 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"386.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582162,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:02.310995" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:02.303772" elapsed="0.007275"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.299233" elapsed="0.011965"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.311402" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.311226" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.299214" elapsed="0.012418"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.316489" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"386.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582162,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.313505" elapsed="0.003183"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.312954" elapsed="0.003830"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.312912" elapsed="0.003966"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.320922" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.317793" elapsed="0.003282"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.317114" elapsed="0.004057"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.317056" elapsed="0.004207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.323331" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.322051" elapsed="0.001420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.324231" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.323707" elapsed="0.000650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.325267" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.324776" elapsed="0.000537"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.324424" elapsed="0.000959"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.323635" elapsed="0.001813"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.326806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.326025" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.327559" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.327063" elapsed="0.000621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.328683" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:02.328213" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.327752" elapsed="0.001045"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.327020" elapsed="0.001841"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.329177" elapsed="0.000642"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:02.330699" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.330103" elapsed="0.000693"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.331071" elapsed="0.002662"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:02.312089" elapsed="0.021751"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.334099" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.333937" elapsed="0.000274"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.333918" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:02.337368" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:02.334375" elapsed="0.003022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:02.337496" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:02.337672" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:02.293356" elapsed="0.044343"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:02.337755" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:02.337900" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755821...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:02.292609" elapsed="0.045316"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.339151" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582162, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:02.338518" elapsed="0.000663"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:02.339262" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:02.339437" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582162, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:02.338189" elapsed="0.001275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.339813" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.339615" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.340205" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.340006" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:02.340276" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:02.340422" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:02.126626" elapsed="0.213820"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:02.340501" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:02.340643" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:02.125904" elapsed="0.214763"/>
</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="PASS" start="2026-04-07T17:16:02.340955" elapsed="0.000206"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:02.340745" elapsed="0.000454"/>
</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-07T17:16:02.341363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.341223" 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-07T17:16:02.341611" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.341440" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.340727" elapsed="0.000961"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:02.125716" elapsed="0.215999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.690155" elapsed="0.651589"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:02.341784" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:02.341999" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:02.342047" level="INFO">${follower_list} = [2, 3]</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-07T17:16:01.686165" elapsed="0.655906"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.342505" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:02.342581" level="INFO">${leader_count} = 1</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-07T17:16:02.342240" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.342880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.342673" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.342655" elapsed="0.000300"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.344964" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:02.343102" elapsed="0.001922"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:02.345366" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.345182" elapsed="0.000208"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:02.345436" elapsed="0.000026"/>
</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="PASS" start="2026-04-07T17:16:01.683681" elapsed="0.661917"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:16:01.683464" elapsed="0.662180"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:16:01.008625" elapsed="1.337050"/>
</for>
<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="PASS" start="2026-04-07T17:16:01.008241" elapsed="1.337488"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:15:56.611416" elapsed="5.734408"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:15:56.136016" elapsed="6.209972"/>
</test>
<test id="s1-s1-s1-t2" name="Start OVS Multiple Connections" line="21">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:02.349125" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:02.348854" 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-07T17:16:02.350376" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.350269" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.350251" 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-07T17:16:02.354930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.354824" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.354801" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.355984" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:02.355596" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.356467" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:02.356166" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:02.356536" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:02.356687" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:02.355227" elapsed="0.001484"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.363014" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.362892" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.362873" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.364296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.364191" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.364173" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.364849" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.364499" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.365293" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:02.365046" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.418509" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:02.365880" elapsed="0.052788"/>
</kw>
<msg time="2026-04-07T17:16:02.418853" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:02.418901" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.365473" elapsed="0.053462"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.485604" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:02.419562" elapsed="0.066224"/>
</kw>
<msg time="2026-04-07T17:16:02.485957" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:02.486024" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.419166" elapsed="0.066894"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.486355" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.486137" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.486117" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.486985" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.486599" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.487376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.487166" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.487148" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:02.487509" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.489810" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.491277" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:02.492688" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:02.488356" elapsed="0.004742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:02.487764" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:02.363867" elapsed="0.129444"/>
</kw>
<msg time="2026-04-07T17:16:02.493401" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.493445" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.363237" elapsed="0.130253"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:02.493674" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.493568" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.493549" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.494156" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.494479" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.494548" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:02.362546" elapsed="0.132107"/>
</kw>
<msg time="2026-04-07T17:16:02.494744" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.494788" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.357077" elapsed="0.137745"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.495196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.494894" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.494878" elapsed="0.000395"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:02.356926" elapsed="0.138369"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.500568" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.500459" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.500441" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.501835" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.501729" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.501711" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.502410" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.502056" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.502833" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:02.502593" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.560310" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:02.503490" elapsed="0.056977"/>
</kw>
<msg time="2026-04-07T17:16:02.560686" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:02.560733" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.503106" elapsed="0.057662"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.633519" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:02.561338" elapsed="0.072360"/>
</kw>
<msg time="2026-04-07T17:16:02.633862" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:02.633908" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.560933" elapsed="0.073009"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.634260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.634044" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.634024" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.634864" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.634497" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.635233" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.635023" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.635004" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:02.635364" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.637649" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:16:02.639168" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:02.640560" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:02.636191" elapsed="0.004759"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:02.635610" elapsed="0.005469"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:02.501416" elapsed="0.139762"/>
</kw>
<msg time="2026-04-07T17:16:02.641267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.641310" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.500781" elapsed="0.140582"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:02.641544" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.641439" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.641421" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.642018" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.642342" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.642413" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:02.500121" elapsed="0.142398"/>
</kw>
<msg time="2026-04-07T17:16:02.642610" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.642652" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.495547" elapsed="0.147140"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.643071" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.642796" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.642778" elapsed="0.000372"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:02.495414" elapsed="0.147759"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.648438" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.648333" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.648314" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.649704" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:02.649598" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.649581" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:02.650272" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:02.649905" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.650686" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:02.650447" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.708775" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:02.651332" elapsed="0.057761"/>
</kw>
<msg time="2026-04-07T17:16:02.709378" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:02.709428" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.650863" elapsed="0.058600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.781652" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:02.710379" elapsed="0.071559"/>
</kw>
<msg time="2026-04-07T17:16:02.782232" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:02.782296" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.709771" elapsed="0.072573"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.782799" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.782463" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.782432" elapsed="0.000506"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.783723" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:02.783159" elapsed="0.000670"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.784237" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.783921" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.783896" elapsed="0.000477"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:02.784418" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.787658" elapsed="0.000726"/>
</kw>
<kw name="Open 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-07T17:16:02.789682" elapsed="0.000767"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:02.791751" elapsed="0.000474"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:02.785640" elapsed="0.006684"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:02.784770" elapsed="0.007711"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:02.649276" elapsed="0.143345"/>
</kw>
<msg time="2026-04-07T17:16:02.792804" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.792865" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.648648" elapsed="0.144265"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:02.793193" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-07T17:16:02.793043" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.793016" elapsed="0.000323"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.793823" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.794169" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:02.794240" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:02.647996" elapsed="0.146350"/>
</kw>
<msg time="2026-04-07T17:16:02.794438" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:02.794481" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.643428" elapsed="0.151088"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:02.794838" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.794591" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.794574" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:02.643293" elapsed="0.151644"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:02.356762" elapsed="0.438305"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:02.354462" elapsed="0.440666"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:02.349984" elapsed="0.445199"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:02.349528" elapsed="0.445701"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:02.346741" elapsed="0.448539"/>
</kw>
<kw name="Add Multiple Managers to OVS" owner="OVSDB">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.802376" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:02.801993" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.802895" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:02.802578" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:02.802965" elapsed="0.000081"/>
</return>
<msg time="2026-04-07T17:16:02.803175" level="INFO">${index_list} = [1, 2, 3]</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-07T17:16:02.801609" elapsed="0.001591"/>
</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-07T17:16:02.805606" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:02.805346" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:02.805327" elapsed="0.000359"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.805999" 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-07T17:16:02.806102" 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-07T17:16:02.805835" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.806656" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:16:02.806274" elapsed="0.000427"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.807269" level="INFO">${conn_id} = 25</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-07T17:16:02.806887" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:02.808176" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:02.808252" 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-07T17:16:02.807887" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.808428" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:02.809593" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:03.509437" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:02.809281" elapsed="0.700335"/>
</kw>
<msg time="2026-04-07T17:16:03.509708" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.808904" elapsed="0.700893"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:02.807506" elapsed="0.702412"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:03.510513" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:16:04.731114" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:04.731460" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:04.731565" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:03.510209" elapsed="1.221413"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:04.732138" elapsed="0.000643"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:04.733892" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:04.733222" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:04.734526" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:04.734226" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:04.734173" elapsed="0.000513"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:04.735066" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-07T17:16:04.734802" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:04.734769" elapsed="0.000491"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:04.735337" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:04.739507" elapsed="0.000492"/>
</kw>
<kw name="Open 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-07T17:16:04.740225" elapsed="0.000217"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:04.740682" elapsed="0.000142"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:04.736113" elapsed="0.004785"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:02.804784" elapsed="1.936264"/>
</kw>
<msg time="2026-04-07T17:16:04.741213" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:02.804242" elapsed="1.937047"/>
</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="PASS" start="2026-04-07T17:16:02.803748" elapsed="1.937655"/>
</kw>
<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-07T17:16:04.744287" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:04.743883" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:04.743840" elapsed="0.000562"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:04.744792" 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-07T17:16:04.744934" 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-07T17:16:04.744606" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:04.745741" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:16:04.745209" elapsed="0.000596"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:04.746550" level="INFO">${conn_id} = 27</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-07T17:16:04.746035" elapsed="0.000550"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:04.747822" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:04.747961" 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-07T17:16:04.747444" elapsed="0.000570"/>
</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-07T17:16:04.748232" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:04.749557" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:05.084180" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:03 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:04.749235" elapsed="0.335048"/>
</kw>
<msg time="2026-04-07T17:16:05.084349" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:04.748870" elapsed="0.335544"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:04.746878" elapsed="0.337621"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.084873" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:16:05.117706" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:16:05.117944" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:05.118085" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:05.084680" elapsed="0.033457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.118494" elapsed="0.000460"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.119946" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.119352" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.120481" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:05.120226" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.120181" elapsed="0.000447"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:05.120998" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:16:05.120740" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.120708" elapsed="0.000480"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.121262" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.127126" elapsed="0.000792"/>
</kw>
<kw name="Open 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-07T17:16:05.128310" elapsed="0.000324"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.128834" elapsed="0.000153"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:05.122055" elapsed="0.007007"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:04.743135" elapsed="0.386052"/>
</kw>
<msg time="2026-04-07T17:16:05.129259" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:04.742349" elapsed="0.386977"/>
</kw>
<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="PASS" start="2026-04-07T17:16:04.741641" elapsed="0.387793"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:16:02.803400" elapsed="2.326112"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.130078" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:05.129715" elapsed="0.000399"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.131175" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:05.130582" elapsed="0.000630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.131782" level="INFO">  tcp:10.30.170.175:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.131429" elapsed="0.000412"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:05.130397" elapsed="0.001488"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.132767" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:05.132209" elapsed="0.000594"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.133361" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.133031" elapsed="0.000389"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:05.132032" elapsed="0.001432"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.134337" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:05.133757" elapsed="0.000617"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.134914" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.134588" elapsed="0.000405"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:05.133584" elapsed="0.001455"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:05.130190" elapsed="0.004889"/>
</for>
<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-07T17:16:05.137992" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:05.137595" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.137569" elapsed="0.000537"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.138480" 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-07T17:16:05.138619" 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-07T17:16:05.138302" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.139410" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640" on remote system "10.30.171.56" 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-07T17:16:05.138864" elapsed="0.000619"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.140243" level="INFO">${conn_id} = 29</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-07T17:16:05.139723" elapsed="0.000556"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.141514" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:05.141593" 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-07T17:16:05.141242" elapsed="0.000375"/>
</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-07T17:16:05.141772" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.142928" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:05.482745" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:05 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:05.142617" elapsed="0.340323"/>
</kw>
<msg time="2026-04-07T17:16:05.483051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.142268" elapsed="0.340881"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:05.140833" elapsed="0.342445"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.483857" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640'.</msg>
<msg time="2026-04-07T17:16:05.506637" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:05.506891" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:05.507027" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:05.483570" elapsed="0.023512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.507470" elapsed="0.000539"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.509115" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.508436" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.509695" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:05.509392" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.509335" elapsed="0.000522"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:05.510250" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:16:05.510012" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.509943" elapsed="0.000489"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.510507" elapsed="0.000030"/>
</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-07T17:16:05.516726" elapsed="0.000358"/>
</kw>
<kw name="Open 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-07T17:16:05.517246" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.517556" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:05.511247" elapsed="0.006455"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:05.136843" elapsed="0.380951"/>
</kw>
<msg time="2026-04-07T17:16:05.517848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.136094" elapsed="0.381804"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl set-manager ${ovs_opt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:05.135342" elapsed="0.382653"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:16:05.529035" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:05.528749" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.528730" elapsed="0.000477"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.529496" 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-07T17:16:05.529599" 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-07T17:16:05.529357" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.530168" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:16:05.529771" elapsed="0.000442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.530721" level="INFO">${conn_id} = 31</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-07T17:16:05.530363" elapsed="0.000383"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.531657" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:05.531731" 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-07T17:16:05.531370" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.531906" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.533554" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:05.873393" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:05 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:05.532749" elapsed="0.340767"/>
</kw>
<msg time="2026-04-07T17:16:05.873579" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.532402" elapsed="0.341237"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:05.530957" elapsed="0.342773"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:05.874115" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:16:05.896717" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:05.897028" level="INFO">${stdout} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-04-07T17:16:05.897135" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:05.873909" elapsed="0.023280"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.897572" elapsed="0.000870"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.899506" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.898831" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.900057" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:05.899760" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.899713" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:05.900605" elapsed="0.000081"/>
</return>
<status status="PASS" start="2026-04-07T17:16:05.900350" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:05.900315" elapsed="0.000498"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.900887" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.906667" elapsed="0.000783"/>
</kw>
<kw name="Open 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-07T17:16:05.907738" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:05.908049" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:05.901602" elapsed="0.006596"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:05.528226" elapsed="0.380062"/>
</kw>
<msg time="2026-04-07T17:16:05.908389" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:05.527647" elapsed="0.380792"/>
</kw>
<msg time="2026-04-07T17:16:05.908550" level="INFO">${output} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:05.527110" elapsed="0.381465"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.908987" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:05.908728" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-07T17:16:05.909701" level="FAIL">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-07T17:16:05.909319" elapsed="0.000463">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:05.909102" elapsed="0.000764">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:05.909083" elapsed="0.000817">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:05.910131" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:05.909983" elapsed="0.000204"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:05.909952" elapsed="0.000259"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.910243" elapsed="0.000015"/>
</return>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="FAIL" start="2026-04-07T17:16:05.526654" elapsed="0.383708">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:16:05.910424" elapsed="0.000015"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-04-07T17:16:05.518710" elapsed="0.391812">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:16:06.930749" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:06.930409" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:06.930380" elapsed="0.000479"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:06.931213" 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-07T17:16:06.931332" 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-07T17:16:06.931023" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:06.931895" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:16:06.931505" elapsed="0.000436"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:06.932484" level="INFO">${conn_id} = 33</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-07T17:16:06.932112" elapsed="0.000398"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:06.933628" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:06.933705" 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-07T17:16:06.933340" elapsed="0.000388"/>
</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-07T17:16:06.933884" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:06.935569" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:07.254595" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:05 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:06.934754" elapsed="0.319965"/>
</kw>
<msg time="2026-04-07T17:16:07.254784" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:06.934391" elapsed="0.320463"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:06.932718" elapsed="0.322227"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:07.255351" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:16:07.308231" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:07.308478" level="INFO">${stdout} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-04-07T17:16:07.308577" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:07.255155" elapsed="0.053472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:07.309024" elapsed="0.000475"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:07.310520" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:07.309884" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:07.311114" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:07.310812" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:07.310763" elapsed="0.000508"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:07.311619" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:16:07.311387" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:07.311354" elapsed="0.000446"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:07.311873" elapsed="0.000030"/>
</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-07T17:16:07.317654" elapsed="0.000767"/>
</kw>
<kw name="Open 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-07T17:16:07.318655" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:07.319084" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:07.312578" elapsed="0.006711"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:06.929844" elapsed="0.389566"/>
</kw>
<msg time="2026-04-07T17:16:07.319483" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:06.929197" elapsed="0.390354"/>
</kw>
<msg time="2026-04-07T17:16:07.319700" level="INFO">${output} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:06.928645" elapsed="0.391090"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:07.320310" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:07.319944" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-07T17:16:07.321295" level="FAIL">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-07T17:16:07.320754" elapsed="0.000644">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:07.320462" elapsed="0.001039">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:07.320437" elapsed="0.001176">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:07.321918" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:07.321715" elapsed="0.000302"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:07.321692" elapsed="0.000358"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:16:07.322096" elapsed="0.000021"/>
</return>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="FAIL" start="2026-04-07T17:16:06.928156" elapsed="0.394105">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:16:07.322349" elapsed="0.000020"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-04-07T17:16:06.911450" elapsed="0.411034">'9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.171.205:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:16:08.339845" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.339520" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.339492" elapsed="0.000458"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.340304" 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-07T17:16:08.340421" 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-07T17:16:08.340114" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.340993" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:16:08.340595" elapsed="0.000445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.341582" level="INFO">${conn_id} = 35</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-07T17:16:08.341191" elapsed="0.000418"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.342504" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:08.342579" 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-07T17:16:08.342221" elapsed="0.000381"/>
</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-07T17:16:08.342755" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.344422" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:08.660475" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:07 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:08.343622" elapsed="0.316999"/>
</kw>
<msg time="2026-04-07T17:16:08.660690" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:08.343253" elapsed="0.317523"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:08.341819" elapsed="0.319054"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.661274" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:16:08.724045" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:08.724297" level="INFO">${stdout} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640...</msg>
<msg time="2026-04-07T17:16:08.724558" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:08.661084" elapsed="0.063530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:08.725003" elapsed="0.000813"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.726824" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.726222" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.727366" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.727105" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.727058" elapsed="0.000464"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:08.727864" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:16:08.727638" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.727604" elapsed="0.000476"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.728154" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:08.733897" elapsed="0.000619"/>
</kw>
<kw name="Open 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-07T17:16:08.734675" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:08.734979" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:08.728827" elapsed="0.006300"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:08.338941" elapsed="0.396273"/>
</kw>
<msg time="2026-04-07T17:16:08.735268" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:08.338286" elapsed="0.397030"/>
</kw>
<msg time="2026-04-07T17:16:08.735427" level="INFO">${output} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640...</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:08.337482" elapsed="0.397973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.735853" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.735605" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-07T17:16:08.736192" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:08.735977" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.735946" elapsed="0.000643"/>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.736852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.736644" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.736627" elapsed="0.000304"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:16:08.736977" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:08.737126" level="INFO">${output} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640...</msg>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="PASS" start="2026-04-07T17:16:08.336812" elapsed="0.400341"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:16:08.737202" elapsed="0.000025"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-04-07T17:16:08.323339" elapsed="0.413977"/>
</kw>
<msg time="2026-04-07T17:16:08.737410" level="INFO">${output} = 9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640...</msg>
<var>${output}</var>
<arg>5s</arg>
<arg>1s</arg>
<arg>Verify OVS Reports Connected</arg>
<arg>${tools_system}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:16:05.518161" elapsed="3.219275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.737846" level="INFO">9a5df812-eb49-4477-a37e-2d464c02791d
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.737603" elapsed="0.000287"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:08.738291" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${index_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.738091" elapsed="0.000225"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.739190" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:08.738878" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:08.739259" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:08.739403" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${controller_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:08.738532" elapsed="0.000896"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.748067" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:08.746183" elapsed="0.001910"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:08.776506" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:08.778772" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1466'} 
 body={"network-topology:topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]} 
 </msg>
<msg time="2026-04-07T17:16:08.779077" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${controller_http_session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_OVSDB1_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:08.748245" elapsed="0.030892"/>
</kw>
<kw name="Log Content" owner="Utils">
<if>
<branch type="IF" condition="'''${resp_content}''' != '${EMPTY}'">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.789643" level="INFO">${resp_json} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d",
                    "ovsdb:co...</msg>
<var>${resp_json}</var>
<arg>json.dumps(json.loads('''${resp_content}'''), sort_keys=True, indent=4, separators=(',', ': '))</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:08.788933" elapsed="0.000739"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:08.787060" elapsed="0.002653"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.789882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.789738" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.787040" elapsed="0.002920"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.790361" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d",
                    "ovsdb:connection-info": {
                        "local-ip": "10.30.170.175",
                        "local-port": 6640,
                        "remote-ip": "10.30.171.56",
                        "remote-port": 54108
                    },
                    "ovsdb:datapath-type-entry": [
                        {
                            "datapath-type": "ovsdb:datapath-type-netdev"
                        },
                        {
                            "datapath-type": "ovsdb:datapath-type-system"
                        }
                    ],
                    "ovsdb:db-version": "8.3.0",
                    "ovsdb:interface-type-entry": [
                        {
                            "interface-type": "ovsdb:interface-type-vxlan"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-tap"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-stt"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-internal"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-patch"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-lisp"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-geneve"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-gre"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-system"
                        }
                    ],
                    "ovsdb:manager-entry": [
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.171.205:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.175:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.206:6640"
                        }
                    ],
                    "ovsdb:openvswitch-external-ids": [
                        {
                            "external-id-key": "system-id",
                            "external-id-value": "3eb07ef3-5df0-4195-8cad-5c56eb67b298"
                        },
                        {
                            "external-id-key": "hostname",
                            "external-id-value": "ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"
                        },
                        {
                            "external-id-key": "rundir",
                            "external-id-value": "/var/run/openvswitch"
                        }
                    ],
                    "ovsdb:ovs-version": "2.17.11"
                }
            ],
            "topology-id": "ovsdb:1"
        }
    ]
}</msg>
<arg>${resp_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.790113" elapsed="0.000348"/>
</kw>
<return>
<value>${resp_json}</value>
<status status="PASS" start="2026-04-07T17:16:08.790519" elapsed="0.000030"/>
</return>
<arg>${resp.text}</arg>
<status status="PASS" start="2026-04-07T17:16:08.779749" elapsed="0.010896"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.793559" level="INFO">${json_data} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:08.793126" elapsed="0.000461"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:08.793635" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:08.793814" level="INFO">${resp_json} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:08.790849" elapsed="0.002992"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:08.794216" level="INFO">${topologies} = [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-ty...</msg>
<var>${topologies}</var>
<arg>${resp_json}</arg>
<arg>network-topology:topology</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.794005" elapsed="0.000239"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:08.794596" level="INFO">${topology} = {'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-typ...</msg>
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.794393" elapsed="0.000229"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:08.794979" level="INFO">${node_list} = [{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsd...</msg>
<var>${node_list}</var>
<arg>${topology}</arg>
<arg>node</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.794770" elapsed="0.000238"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.795428" level="INFO">[{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb:interface-type-tap'}, {'interface-type': 'ovsdb:interface-type-stt'}, {'interface-type': 'ovsdb:interface-type-internal'}, {'interface-type': 'ovsdb:interface-type-patch'}, {'interface-type': 'ovsdb:interface-type-lisp'}, {'interface-type': 'ovsdb:interface-type-geneve'}, {'interface-type': 'ovsdb:interface-type-gre'}, {'interface-type': 'ovsdb:interface-type-system'}], 'ovsdb:ovs-version': '2.17.11', 'ovsdb:connection-info': {'local-port': 6640, 'remote-port': 54108, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}, 'ovsdb:openvswitch-external-ids': [{'external-id-key': 'system-id', 'external-id-value': '3eb07ef3-5df0-4195-8cad-5c56eb67b298'}, {'external-id-key': 'hostname', 'external-id-value': 'ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d'}, {'external-id-key': 'rundir', 'external-id-value': '/var/run/openvswitch'}], 'ovsdb:datapath-type-entry': [{'datapath-type': 'ovsdb:datapath-type-netdev'}, {'datapath-type': 'ovsdb:datapath-type-system'}], 'ovsdb:manager-entry': [{'target': 'tcp:10.30.171.205:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.175:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.206:6640', 'number_of_connections': 1, 'connected': True}]}]</msg>
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.795159" elapsed="0.000325"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:08.796056" level="INFO">${node_id} = ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${node_id}</var>
<arg>${node}</arg>
<arg>node-id</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.795869" elapsed="0.000213"/>
</kw>
<kw name="Replace String" owner="String">
<msg time="2026-04-07T17:16:08.798155" level="INFO">${node_uuid} = 9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${node_uuid}</var>
<arg>${node_id}</arg>
<arg>ovsdb://uuid/</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.796234" elapsed="0.001947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.798731" elapsed="0.000145"/>
</kw>
<msg time="2026-04-07T17:16:08.798984" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:08.799034" level="INFO">${connection_info} = {'local-port': 6640, 'remote-port': 54108, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}</msg>
<var>${status}</var>
<var>${connection_info}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.798346" elapsed="0.000711"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.799552" elapsed="0.000148"/>
</kw>
<msg time="2026-04-07T17:16:08.799794" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:08.799836" level="INFO">${remote_ip} = 10.30.171.56</msg>
<var>${status}</var>
<var>${remote_ip}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.799218" elapsed="0.000640"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.800443" level="INFO">${uuid} = 9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${uuid}</var>
<arg>'${remote_ip}' == '${ovs_system_ip}'</arg>
<arg>${node_uuid}</arg>
<arg>${uuid}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:08.800058" elapsed="0.000411"/>
</kw>
<var name="${node}">{'node-id': 'ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb...</var>
<status status="PASS" start="2026-04-07T17:16:08.795736" elapsed="0.004773"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="PASS" start="2026-04-07T17:16:08.795543" elapsed="0.005086"/>
</for>
<return>
<value>${uuid}</value>
<status status="PASS" start="2026-04-07T17:16:08.800675" elapsed="0.000027"/>
</return>
<arg>controller_http_session=${session}</arg>
<doc>Queries the topology in the operational datastore and searches for the node that has
the ${ovs_system_ip} argument as the "remote-ip". If found, the value returned will be the value of
node-id stripped of "ovsdb://uuid/". If not found,  will be returned.</doc>
<status status="PASS" start="2026-04-07T17:16:08.745740" elapsed="0.055055"/>
</kw>
<msg time="2026-04-07T17:16:08.800873" level="INFO">${ovsdb_uuid} = 9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${ovsdb_uuid}</var>
<arg>30s</arg>
<arg>2s</arg>
<arg>OVSDB.Get OVSDB UUID</arg>
<arg>controller_http_session=${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:16:08.739586" elapsed="0.061311"/>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="PASS" start="2026-04-07T17:16:08.800945" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:08.801109" level="INFO">${ovsdb_uuid} = 9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${ovsdb_uuid}</var>
<doc>Connect OVS to the list of controllers in the ${controller_index_list} or all if no list is provided.</doc>
<status status="PASS" start="2026-04-07T17:16:02.799396" elapsed="6.001738"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.801655" level="INFO">${ovsdb_uuid} = 9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>${ovsdb_uuid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-07T17:16:08.801331" elapsed="0.000365"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="PASS" start="2026-04-07T17:16:02.346243" elapsed="6.455577"/>
</test>
<test id="s1-s1-s1-t3" name="Check Entity Owner Status And Find Owner and Candidate Before Fail" line="26">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:08.805753" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:08.805490" 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-07T17:16:08.806981" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.806859" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.806841" elapsed="0.000208"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.811708" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.811603" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.811585" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.812751" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:08.812376" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.813246" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:08.812931" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:08.813328" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:08.813486" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:08.812008" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.818520" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.818412" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.818393" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.819776" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.819671" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.819654" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:08.820371" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.820018" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.820796" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:08.820551" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.864831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:08.821395" elapsed="0.043608"/>
</kw>
<msg time="2026-04-07T17:16:08.865192" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:08.865238" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.820992" elapsed="0.044294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.973300" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:08.865846" elapsed="0.107702"/>
</kw>
<msg time="2026-04-07T17:16:08.973718" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:08.973763" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.865459" elapsed="0.108339"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.974126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.973877" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.973856" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:08.974732" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:08.974362" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.975116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.974886" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.974868" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:08.975247" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:08.977582" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:16:08.979025" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:08.980402" elapsed="0.000453"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:08.976113" elapsed="0.004815"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:08.975508" elapsed="0.005564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:08.819371" elapsed="0.161802"/>
</kw>
<msg time="2026-04-07T17:16:08.981279" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:08.981321" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.818733" elapsed="0.162623"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:08.981541" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:08.981435" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.981416" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.982039" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.982375" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.982446" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:08.818080" elapsed="0.164472"/>
</kw>
<msg time="2026-04-07T17:16:08.982644" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:08.982686" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.813857" elapsed="0.168864"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:08.983051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:08.982795" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.982779" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:08.813723" elapsed="0.169430"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.988238" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.988132" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.988113" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:08.989594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:08.989486" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:08.989468" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:08.990254" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:08.989798" elapsed="0.000483"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:08.990671" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:08.990432" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:09.033507" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:08.991253" elapsed="0.042422"/>
</kw>
<msg time="2026-04-07T17:16:09.033843" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:09.033888" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.990851" elapsed="0.043072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:09.129238" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:09.034492" elapsed="0.094950"/>
</kw>
<msg time="2026-04-07T17:16:09.129615" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:09.129660" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.034110" elapsed="0.095585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.130011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.129771" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.129752" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.130620" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:09.130251" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.131000" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.130774" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.130756" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:09.131132" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:09.133406" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:09.134817" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:09.136199" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:09.131944" elapsed="0.004644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:09.131377" elapsed="0.005321"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:08.989155" elapsed="0.147640"/>
</kw>
<msg time="2026-04-07T17:16:09.136885" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:09.136928" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.988495" elapsed="0.148481"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:09.137174" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:09.137055" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.137035" elapsed="0.000258"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.137672" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.138188" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.138263" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:08.987784" elapsed="0.150587"/>
</kw>
<msg time="2026-04-07T17:16:09.138463" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:09.138505" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.983406" elapsed="0.155134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.138858" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.138615" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.138598" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:08.983273" elapsed="0.155687"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.144165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:09.144058" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.144039" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.145433" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:09.145323" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.145306" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:09.145999" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:09.145636" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:09.146415" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:09.146177" elapsed="0.000263"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:09.191559" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:09.147025" elapsed="0.044701"/>
</kw>
<msg time="2026-04-07T17:16:09.191891" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:09.191937" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.146593" elapsed="0.045398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:09.287853" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:09.192541" elapsed="0.095520"/>
</kw>
<msg time="2026-04-07T17:16:09.288227" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:09.288272" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.192156" elapsed="0.096150"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.288597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.288381" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.288362" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.289247" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:09.288836" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.289648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.289435" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.289416" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:09.289780" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:09.292043" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:16:09.293471" elapsed="0.000454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:09.294825" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:09.290617" elapsed="0.004608"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:09.290042" elapsed="0.005295"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:09.145001" elapsed="0.150435"/>
</kw>
<msg time="2026-04-07T17:16:09.295526" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:09.295568" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.144379" elapsed="0.151225"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:09.295786" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:09.295680" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.295661" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.296267" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.296599" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.296669" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:09.143710" elapsed="0.153065"/>
</kw>
<msg time="2026-04-07T17:16:09.296865" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:09.296907" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.139247" elapsed="0.157695"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.297302" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:09.297059" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.297041" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:09.139111" elapsed="0.158290"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:08.813560" elapsed="0.483869"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:08.811244" elapsed="0.486245"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:08.806579" elapsed="0.490966"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:08.806170" elapsed="0.491418"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:08.803109" elapsed="0.494530"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:16:09.331436" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:09.331058" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.331917" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:09.331617" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:09.332004" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:09.332232" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:09.330677" elapsed="0.001580"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:09.336750" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:09.336571" elapsed="0.000205"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:09.337189" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.336920" elapsed="0.000347">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.337427" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.337614" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.337770" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.337929" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.338124" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.338287" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.338465" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.338623" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.348519" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.348712" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.358423" 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-07T17:16:09.358611" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.358677" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.336042" elapsed="0.022752">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:09.358904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:09.358946" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.335468" elapsed="0.023514"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.359174" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:09.359065" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:09.359047" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:09.360535" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.361290" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:09.360893" elapsed="0.000422"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:09.362113" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:09.361833" elapsed="0.000305"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:09.362186" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:09.362334" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:09.361499" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.362876" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:09.362513" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.363420" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:09.363072" elapsed="0.000375"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:09.363849" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:09.422862" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:09.363606" elapsed="0.067703">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.431723" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.432140" 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-07T17:16:09.432553" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.433001" elapsed="0.000052"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.433385" elapsed="0.000051"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.433651" 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-07T17:16:09.433917" 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-07T17:16:09.434102" 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-07T17:16:09.434264" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:09.433794" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.433727" 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-07T17:16:09.434478" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.434536" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.359999" elapsed="0.074648">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:09.434761" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:09.434804" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:09.359381" elapsed="0.075446"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:09.435460" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.435144" elapsed="0.000374">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:09.434916" elapsed="0.000664">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:09.434892" elapsed="0.000779">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.435723" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.334916" elapsed="0.100912">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.436018" 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-07T17:16:09.436185" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.436247" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:09.332557" elapsed="0.103792">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:09.436515" 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-07T17:16:09.436690" 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-07T17:16:09.436856" 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-07T17:16:09.437046" 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-07T17:16:09.437219" 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-07T17:16:09.437380" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:09.437441" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.330069" elapsed="0.107470">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:10.470762" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:10.470291" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:10.471289" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:10.470961" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:10.471362" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:16:10.471538" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:10.469895" 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-07T17:16:10.476115" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:10.475908" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:10.476567" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.476288" elapsed="0.000420">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.476875" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477097" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477258" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477416" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477593" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477756" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.477929" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.478101" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.488020" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.488213" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.498024" 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-07T17:16:10.498215" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.498281" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.475378" elapsed="0.023018">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:10.498508" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:10.498551" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:10.474809" elapsed="0.023765"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.498776" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:10.498661" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:10.498641" 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-07T17:16:10.500150" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:10.500842" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:10.500525" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:10.501982" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:10.501639" elapsed="0.000371"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:10.502060" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:10.502209" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:10.501066" elapsed="0.001167"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:10.502755" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:10.502390" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:10.503339" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:10.502986" elapsed="0.000379"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:10.503750" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:10.516755" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:10.503523" elapsed="0.016425">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.520422" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.520808" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.521205" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.521574" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.521948" elapsed="0.000081"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.522344" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.522933" 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-07T17:16:10.523349" 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-07T17:16:10.523709" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:10.522653" elapsed="0.001175"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.522497" elapsed="0.001392"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.524224" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.524390" elapsed="0.000037"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.499601" elapsed="0.025039">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:10.524896" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:10.525037" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:10.499005" elapsed="0.026086"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:10.526472" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.525739" elapsed="0.000862">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:10.525276" elapsed="0.001464">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:10.525236" elapsed="0.001574">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.526909" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.474257" elapsed="0.052901">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.527619" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.528010" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.528151" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:10.471863" elapsed="0.056568">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.528812" elapsed="0.000050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.529241" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:10.529503" 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-07T17:16:10.529664" 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-07T17:16:10.529836" 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-07T17:16:10.530016" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:10.530082" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:10.469174" elapsed="0.061011">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:11.562383" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:11.561949" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:11.562873" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:11.562570" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:11.562943" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:16:11.563121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:11.561582" elapsed="0.001563"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:11.567818" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:11.567637" elapsed="0.000207"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:11.568245" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.568003" elapsed="0.000305">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.568468" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.568667" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.568821" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.568996" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.569224" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.569390" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.569562" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.569718" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.579443" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.579636" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.589394" 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-07T17:16:11.589586" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.589652" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.567098" elapsed="0.022662">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:11.589875" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:11.589918" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:11.566534" elapsed="0.023406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.590156" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:11.590044" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:11.590025" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:11.591522" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:11.592222" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:11.591877" elapsed="0.000371"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:11.593045" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:11.592770" elapsed="0.000303"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:11.593119" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:11.593266" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:11.592428" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:11.593813" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:11.593442" elapsed="0.000397"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:11.594353" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:11.594008" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:11.594749" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:11.608414" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:11.594538" elapsed="0.017625">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.612637" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.613048" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.613429" elapsed="0.000053"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.613799" 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-07T17:16:11.614208" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.614566" 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-07T17:16:11.615204" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.615580" 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-07T17:16:11.615926" elapsed="0.000072"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:11.614884" elapsed="0.001190"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.614713" elapsed="0.001420"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.616440" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.616572" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.590955" elapsed="0.025857">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:11.617092" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:11.617190" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:11.590364" elapsed="0.026879"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:11.618719" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.617902" elapsed="0.000953">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:11.617426" elapsed="0.001612">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:11.617385" elapsed="0.001740">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.619228" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.565986" elapsed="0.053475">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.619652" 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-07T17:16:11.619812" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.619872" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:11.563434" elapsed="0.056548">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:11.620182" 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-07T17:16:11.620356" 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-07T17:16:11.620519" 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-07T17:16:11.620675" 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-07T17:16:11.620836" 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-07T17:16:11.621009" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:11.621071" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:11.560928" elapsed="0.060241">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:12.653353" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:12.652805" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:12.653884" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:12.653564" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:12.653999" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:16:12.654189" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:12.652408" elapsed="0.001805"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:12.658866" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:12.658669" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:12.659530" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.659057" elapsed="0.000560">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.659788" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660016" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660173" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660332" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660507" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660673" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.660851" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.661020" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.670804" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.671080" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.680781" 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-07T17:16:12.680985" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.681054" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.658101" elapsed="0.023093">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:12.681311" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:12.681353" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:12.657489" elapsed="0.023886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.681591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:12.681467" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:12.681446" 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-07T17:16:12.682999" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:12.683682" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:12.683362" elapsed="0.000346"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:12.684525" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:12.684253" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:12.684598" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:12.684744" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:12.683890" elapsed="0.000877"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:12.685322" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:12.684921" elapsed="0.000427"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:12.685848" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:12.685504" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:12.686290" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:12.699348" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:12.686046" elapsed="0.015896">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.702224" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.702460" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.702684" 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-07T17:16:12.702905" 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-07T17:16:12.703158" 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-07T17:16:12.703377" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.703985" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.704220" 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-07T17:16:12.704443" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:12.703790" elapsed="0.000725"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.703677" elapsed="0.000877"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.704810" elapsed="0.000031"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.704898" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.682444" elapsed="0.022653">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:12.705280" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:12.705355" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:12.681806" elapsed="0.023590"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:12.706630" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.705837" elapsed="0.000878">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:12.705539" elapsed="0.001264">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:12.705510" elapsed="0.001338">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.706912" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.656925" elapsed="0.050144">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.707311" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.707537" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.707621" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:12.654519" elapsed="0.053238">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.708001" 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-07T17:16:12.708247" 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-07T17:16:12.708490" 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-07T17:16:12.708710" 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-07T17:16:12.708931" elapsed="0.000053"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:12.709179" elapsed="0.000072"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:12.709320" elapsed="0.000031"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:12.651513" elapsed="0.057976">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:13.739505" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:13.738961" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:13.740110" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:13.739716" elapsed="0.000420"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:13.740189" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:13.740382" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:13.738566" elapsed="0.001840"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:13.745066" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:13.744856" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:13.745499" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.745241" elapsed="0.000342">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.745744" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.745958" elapsed="0.000041"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746148" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746306" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746480" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746638" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746815" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.746993" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.759378" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.759577" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.769418" 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-07T17:16:13.769610" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.769743" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.744303" elapsed="0.025566">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:13.770026" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:13.770079" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:13.743700" elapsed="0.026402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.770322" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:13.770197" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:13.770174" 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-07T17:16:13.771719" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:13.772419" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:13.772095" elapsed="0.000350"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:13.773278" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:13.772958" elapsed="0.000347"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:13.773353" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:13.773504" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:13.772627" elapsed="0.000901"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:13.774094" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:13.773685" elapsed="0.000437"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:13.774719" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:13.774301" elapsed="0.000448"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:13.775259" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:13.788237" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:13.774939" elapsed="0.017217">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.792575" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.792955" elapsed="0.000084"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.793361" 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-07T17:16:13.793718" 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-07T17:16:13.794111" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.794464" elapsed="0.000060"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.795109" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.795477" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.795818" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:13.794797" elapsed="0.001134"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.794634" elapsed="0.001387"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.796329" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.796458" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.771179" elapsed="0.025658">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:13.797137" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:13.797235" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:13.770542" elapsed="0.026744"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:13.799067" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.797948" elapsed="0.001263">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:13.797473" elapsed="0.001891">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:13.797431" elapsed="0.002014">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.799503" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.743131" elapsed="0.056480">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.799785" 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-07T17:16:13.799946" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.800022" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:13.740712" elapsed="0.059408">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:13.800283" 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-07T17:16:13.800496" 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-07T17:16:13.800660" 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-07T17:16:13.800813" 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-07T17:16:13.800985" 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-07T17:16:13.801144" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:13.801203" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:13.737735" elapsed="0.063564">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:14.833313" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:14.832771" elapsed="0.000577"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:14.833839" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:14.833519" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:14.833915" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:16:14.834122" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:14.832300" 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-07T17:16:14.838730" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:14.838534" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:14.839173" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.838905" elapsed="0.000351">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.839420" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.839630" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.839784" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.839941" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.840136" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.840295" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.840468" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.840622" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.850423" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.850614" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.860317" 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-07T17:16:14.860529" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.860596" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.838000" elapsed="0.022720">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:14.860833" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:14.860876" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:14.837425" elapsed="0.023473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.861176" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:14.861010" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:14.860988" 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-07T17:16:14.862561" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:14.863259" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:14.862922" elapsed="0.000363"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:14.864237" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:14.863799" elapsed="0.000464"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:14.864320" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:14.864484" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:14.863466" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:14.865060" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:14.864664" elapsed="0.000422"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:14.865592" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:14.865242" elapsed="0.000375"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:14.866033" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:14.879579" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:14.865775" elapsed="0.016112">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.882164" 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-07T17:16:14.882397" 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-07T17:16:14.882619" 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-07T17:16:14.882841" 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-07T17:16:14.883097" 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-07T17:16:14.883319" 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-07T17:16:14.883701" 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-07T17:16:14.883982" 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-07T17:16:14.884213" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:14.883527" elapsed="0.000760"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.883419" elapsed="0.000909"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.884518" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.884598" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.862023" elapsed="0.022725">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:14.884907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:14.884990" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:14.861403" elapsed="0.023622"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:14.885938" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.885491" elapsed="0.000557">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:14.885193" elapsed="0.000943">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:14.885166" elapsed="0.001014">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.886243" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.836835" elapsed="0.049544">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.886622" 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-07T17:16:14.886846" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.886930" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:14.834449" elapsed="0.052639">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.887317" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.887559" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.887789" 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-07T17:16:14.888074" 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-07T17:16:14.888322" elapsed="0.000044"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:14.888556" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:14.888617" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:14.831492" elapsed="0.057226">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:15.918369" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:15.917868" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:15.918882" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:15.918570" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:15.918954" elapsed="0.000056"/>
</return>
<msg time="2026-04-07T17:16:15.919141" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:15.917484" 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-07T17:16:15.924050" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:15.923845" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:15.924458" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.924223" elapsed="0.000310">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.924694" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.924903" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925074" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925249" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925427" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925586" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925757" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.925914" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.935742" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.935934" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.945660" 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-07T17:16:15.945850" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.945915" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.923309" elapsed="0.022736">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:15.946159" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:15.946202" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:15.922727" elapsed="0.023498"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.946426" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:15.946311" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:15.946291" 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-07T17:16:15.947795" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:15.948499" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:15.948173" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:15.949338" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:15.949071" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:15.949452" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:15.949604" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:15.948705" elapsed="0.000924"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:15.950168" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:15.949785" elapsed="0.000409"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:15.950689" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:15.950347" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:15.951114" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:15.964328" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:15.950871" elapsed="0.016166">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.967445" 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-07T17:16:15.967816" 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-07T17:16:15.968197" 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-07T17:16:15.968577" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.968988" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.969346" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.969914" 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-07T17:16:15.970325" 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-07T17:16:15.970685" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:15.969639" elapsed="0.001161"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.969491" elapsed="0.001368"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.971185" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.971321" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.947249" elapsed="0.024312">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:15.971808" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:15.971904" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:15.946638" elapsed="0.025317"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:15.973639" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.973074" elapsed="0.000630">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:15.972168" elapsed="0.001599">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:15.972127" elapsed="0.001672">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.973843" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.922181" elapsed="0.051765">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.974183" 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-07T17:16:15.974374" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.974450" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:15.919541" elapsed="0.055016">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:15.974721" 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-07T17:16:15.974900" 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-07T17:16:15.975081" 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-07T17:16:15.975239" 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-07T17:16:15.975399" 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-07T17:16:15.975556" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:15.975616" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:15.916715" elapsed="0.058998">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:17.007297" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:17.006822" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:17.007810" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:17.007498" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:17.007882" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:16:17.008070" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:17.006444" 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-07T17:16:17.012733" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:17.012528" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:17.013172" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.012905" elapsed="0.000552">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.013622" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.013830" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014002" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014163" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014406" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014569" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014748" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.014904" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.024732" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.024924" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.034681" 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-07T17:16:17.034870" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.034937" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.011917" elapsed="0.023149">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:17.035180" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:17.035223" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:17.011354" elapsed="0.023891"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.035445" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:17.035330" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:17.035310" 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-07T17:16:17.036826" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:17.037512" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:17.037201" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:17.038333" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:17.038064" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:17.038405" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:17.038552" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:17.037718" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:17.039112" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:17.038729" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:17.039631" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:17.039289" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:17.040065" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:17.051901" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:17.039812" elapsed="0.015530">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.055851" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.056276" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.056644" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.057040" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.057421" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.057778" 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-07T17:16:17.058391" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.058763" 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-07T17:16:17.059143" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:17.058111" elapsed="0.001154"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.057928" elapsed="0.001396"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.059626" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.059756" elapsed="0.000073"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.036286" elapsed="0.023790">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:17.060348" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:17.060428" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:17.035655" elapsed="0.024802"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:17.061095" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.060758" elapsed="0.000396">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:17.060548" elapsed="0.000874">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:17.060530" elapsed="0.000930">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.061507" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.010788" elapsed="0.050820">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.061781" 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-07T17:16:17.061942" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.062020" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:17.008394" elapsed="0.053722">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:17.062316" 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-07T17:16:17.062492" 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-07T17:16:17.062658" 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-07T17:16:17.062817" 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-07T17:16:17.062993" 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-07T17:16:17.063156" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:17.063216" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:17.005723" elapsed="0.057590">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:18.095586" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:18.095187" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:18.096095" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:18.095770" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:18.096165" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:18.096322" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:18.094804" elapsed="0.001542"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:18.100835" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:18.100655" elapsed="0.000206"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:18.101235" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.101020" elapsed="0.000275">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.101455" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.101647" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.101828" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.102012" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.102189" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.102347" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.102524" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.102680" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.112549" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.112782" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.122618" 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-07T17:16:18.122808" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.122874" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.100128" elapsed="0.022867">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:18.123106" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:18.123148" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:18.099564" elapsed="0.023607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.123361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:18.123253" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:18.123235" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:18.124716" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:18.125391" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:18.125087" elapsed="0.000329"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:18.126228" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:18.125949" elapsed="0.000305"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:18.126301" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:18.126447" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:18.125617" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:18.127006" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:18.126625" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:18.127532" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:18.127184" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:18.127921" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:18.142595" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:18.127713" elapsed="0.018382">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.146574" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.146951" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.147350" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.147729" 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-07T17:16:18.148165" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.148523" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.149271" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.149648" 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-07T17:16:18.150027" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:18.148943" elapsed="0.001204"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.148787" elapsed="0.001417"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.150506" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.150637" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.124170" elapsed="0.026707">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:18.151160" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:18.151270" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:18.123568" elapsed="0.027755"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:18.152701" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.151999" elapsed="0.000848">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:18.151505" elapsed="0.001513">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:18.151464" elapsed="0.001629">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.153238" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.099029" elapsed="0.054537">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.154003" elapsed="0.000051"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.154389" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.154464" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:18.096635" elapsed="0.057929">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:18.154725" 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-07T17:16:18.154896" 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-07T17:16:18.155075" 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-07T17:16:18.155235" 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-07T17:16:18.155398" 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-07T17:16:18.155555" elapsed="0.000050"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:18.155649" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:18.094155" elapsed="0.061592">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:19.187758" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:19.187288" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:19.188260" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:19.187942" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:19.188330" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:19.188485" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:19.186903" elapsed="0.001606"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:19.193080" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:19.192874" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:19.193462" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.193249" elapsed="0.000272">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.193679" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.193866" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194046" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194211" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194385" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194543" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194714" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.194869" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.204598" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.204785" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.214461" 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-07T17:16:19.214648" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.214748" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.192351" elapsed="0.022506">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:19.214978" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:19.215023" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:19.191787" elapsed="0.023259"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.215236" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:19.215128" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:19.215110" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:19.216583" elapsed="0.000218"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:19.217293" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:19.216979" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:19.218254" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:19.217985" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:19.218332" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:19.218478" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:19.217497" elapsed="0.001005"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:19.219038" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:19.218656" elapsed="0.000409"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:19.219561" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:19.219217" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:19.219942" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:19.234322" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:19.219743" elapsed="0.017264">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.237415" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.237789" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.238178" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.238539" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.238920" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.239315" 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-07T17:16:19.239879" 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-07T17:16:19.240312" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.240685" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:19.239606" elapsed="0.001197"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.239459" elapsed="0.001399"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.241194" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.241328" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.216052" elapsed="0.025593">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:19.241901" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:19.242063" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:19.215444" elapsed="0.026680"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:19.243538" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.242787" elapsed="0.000883">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:19.242311" elapsed="0.001497">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:19.242271" elapsed="0.001607">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.244008" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.191250" elapsed="0.052980">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.244654" elapsed="0.000050"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.245050" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.245190" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:19.188795" elapsed="0.056527">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:19.245484" 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-07T17:16:19.245655" 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-07T17:16:19.245818" 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-07T17:16:19.245986" 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-07T17:16:19.246149" 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-07T17:16:19.246307" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:19.246366" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:19.186292" elapsed="0.060171">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:20.279824" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:20.279362" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:20.280350" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:20.280034" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:20.280423" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:16:20.280598" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:20.278903" elapsed="0.001719"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:20.285482" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:20.285287" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:20.285908" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.285658" elapsed="0.000347">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.286169" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.286378" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.286533" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.286690" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.286864" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.287036" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.287210" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.287365" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.297165" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.297357" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.307108" 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-07T17:16:20.307298" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.307364" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.284732" elapsed="0.022745">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:20.307588" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:20.307631" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:20.284170" elapsed="0.023483"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.307897" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:20.307741" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:20.307721" 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-07T17:16:20.309308" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:20.310019" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:20.309687" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:20.310829" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:20.310567" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:20.310901" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:20.311063" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:20.310226" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:20.311612" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:20.311244" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:20.312145" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:20.311788" elapsed="0.000382"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:20.312549" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:20.326517" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:20.312325" elapsed="0.017345">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.330128" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.330505" 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-07T17:16:20.330860" 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-07T17:16:20.331276" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.331652" 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-07T17:16:20.332040" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.332634" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.333035" 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-07T17:16:20.333448" elapsed="0.000052"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:20.332345" elapsed="0.001232"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.332195" elapsed="0.001441"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.333940" elapsed="0.000077"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.334105" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.308750" elapsed="0.025594">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:20.334613" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:20.334711" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:20.308140" elapsed="0.026623"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:20.336328" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.335580" elapsed="0.000881">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:20.335100" elapsed="0.001498">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:20.335053" elapsed="0.001615">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.336768" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.283611" elapsed="0.053403">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.337454" elapsed="0.000055"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.337872" elapsed="0.000058"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.338068" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:20.280926" elapsed="0.057386">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:20.338504" 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-07T17:16:20.338678" 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-07T17:16:20.338841" 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-07T17:16:20.339011" 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-07T17:16:20.339174" 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-07T17:16:20.339332" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:20.339392" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:20.278198" elapsed="0.061291">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:21.370991" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:21.370551" elapsed="0.000471"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:21.371489" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:21.371181" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:21.371560" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:16:21.371720" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:21.370174" elapsed="0.001571"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:21.378327" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:21.378136" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:21.378721" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.378497" elapsed="0.000292">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.378949" elapsed="0.000036"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379162" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379317" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379477" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379654" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379811" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.379997" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.380166" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.389890" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.390093" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.399776" 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-07T17:16:21.399975" elapsed="0.000044"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.400073" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.377592" elapsed="0.022593">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:21.400299" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:21.400341" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:21.377032" elapsed="0.023332"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.400558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:21.400446" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:21.400427" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:21.401905" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:21.402587" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:21.402280" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:21.403408" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:21.403142" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:21.403520" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:21.403671" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:21.402791" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:21.404246" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:21.403849" elapsed="0.000423"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:21.404765" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:21.404424" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:21.405182" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:21.416455" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:21.404947" elapsed="0.013878">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.419100" 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-07T17:16:21.419335" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.419557" 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-07T17:16:21.419777" 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-07T17:16:21.420045" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.420268" 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-07T17:16:21.420629" 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-07T17:16:21.420858" 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-07T17:16:21.421103" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:21.420457" elapsed="0.000721"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.420360" 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-07T17:16:21.421404" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.421484" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.401371" elapsed="0.020262">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:21.421788" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:21.421848" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:21.400768" elapsed="0.021112"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:21.422744" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.422308" elapsed="0.000518">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:21.422015" elapsed="0.000897">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:21.421988" elapsed="0.000968">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.423042" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.376468" elapsed="0.046710">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.423465" 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-07T17:16:21.423690" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.423781" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:21.372104" elapsed="0.051832">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.424190" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.424429" 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-07T17:16:21.424657" 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-07T17:16:21.424878" 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-07T17:16:21.425126" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:21.425362" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:21.425447" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:21.369506" elapsed="0.056078">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:22.456237" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:22.455663" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:22.456776" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:22.456450" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:22.456852" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:22.457062" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:22.455263" 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-07T17:16:22.461738" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:22.461534" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:22.462183" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.461912" elapsed="0.000359">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.462435" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.462650" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.462803" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.462961" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.463242" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.463405" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.463577" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.463734" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.473793" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.474001" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.483719" 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-07T17:16:22.483930" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.484016" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.460996" elapsed="0.023148">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:22.484259" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:22.484302" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:22.460414" elapsed="0.023910"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.484538" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:22.484413" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:22.484393" 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-07T17:16:22.485915" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:22.486615" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:22.486298" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:22.487438" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:22.487173" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:22.487510" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:22.487670" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:22.486825" elapsed="0.000869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:22.488263" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:22.487852" elapsed="0.000437"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:22.488784" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:22.488445" elapsed="0.000365"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:22.489228" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:22.502265" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:22.488983" elapsed="0.016088">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.505561" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.505938" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.506334" 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-07T17:16:22.506693" 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-07T17:16:22.507091" 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-07T17:16:22.507467" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.508104" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.508483" 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-07T17:16:22.508833" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:22.507790" elapsed="0.001159"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.507625" elapsed="0.001414"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.509346" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.509475" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.485379" elapsed="0.024338">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:22.509992" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:22.510096" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:22.484753" elapsed="0.025394"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:22.511586" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.510797" elapsed="0.000924">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:22.510329" elapsed="0.001534">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:22.510289" elapsed="0.001646">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.512069" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.459840" elapsed="0.052455">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.512600" 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-07T17:16:22.512763" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.512824" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:22.457396" elapsed="0.055528">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:22.513146" 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-07T17:16:22.513325" 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-07T17:16:22.513488" 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-07T17:16:22.513644" 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-07T17:16:22.513810" 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-07T17:16:22.513989" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:22.514052" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:22.454449" elapsed="0.059702">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:23.546806" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:23.546394" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:23.547317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:23.547006" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:23.547388" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:16:23.547560" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:23.546011" elapsed="0.001577"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:23.552189" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:23.552001" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:23.552606" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.552363" elapsed="0.000308">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.552832" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553042" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553201" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553362" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553545" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553706" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.553881" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.554053" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.563944" elapsed="0.000039"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.564201" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.573954" 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-07T17:16:23.574157" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.574225" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.551449" elapsed="0.022886">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:23.574445" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:23.574489" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:23.550874" elapsed="0.023638"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.574706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:23.574595" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:23.574576" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:23.576094" elapsed="0.000226"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:23.576785" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:23.576471" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:23.577771" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:23.577345" elapsed="0.000453"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:23.577846" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:23.578012" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:23.577007" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:23.578564" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:23.578196" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:23.579107" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:23.578744" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:23.579509" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:23.591345" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:23.579296" elapsed="0.014936">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.594638" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.595050" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.595415" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.595772" 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-07T17:16:23.596192" 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-07T17:16:23.596554" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.597272" 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-07T17:16:23.597700" 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-07T17:16:23.598120" elapsed="0.000051"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:23.596942" elapsed="0.001304"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.596786" elapsed="0.001520"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.598613" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.598745" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.575534" elapsed="0.023480">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:23.599271" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:23.599367" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:23.574918" elapsed="0.024501"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:23.600852" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.600142" elapsed="0.000878">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:23.599600" elapsed="0.001568">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:23.599560" elapsed="0.001689">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.601361" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.550331" elapsed="0.051135">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.601639" 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-07T17:16:23.601803" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.601864" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:23.547890" elapsed="0.054084">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:23.602143" 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-07T17:16:23.602316" 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-07T17:16:23.602479" 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-07T17:16:23.602635" 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-07T17:16:23.602801" 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-07T17:16:23.602960" elapsed="0.000072"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:23.603078" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:23.545367" elapsed="0.057812">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:24.634200" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:24.633723" elapsed="0.000510"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:24.634711" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:24.634398" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:24.634784" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:16:24.634953" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:24.633340" 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-07T17:16:24.639849" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:24.639659" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:24.640271" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.640037" elapsed="0.000303">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.640500" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.640706" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.640866" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.641041" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.641228" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.641421" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.641598" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.641756" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.651681" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.651875" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.661660" 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-07T17:16:24.661853" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.662018" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.639113" elapsed="0.023022">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:24.662249" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:24.662293" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:24.638534" elapsed="0.023783"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.662519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:24.662403" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:24.662384" 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-07T17:16:24.663888" elapsed="0.000231"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:24.664600" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:24.664284" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:24.665424" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:24.665158" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:24.665497" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:24.665644" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:24.664809" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:24.666211" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:24.665823" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:24.666734" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:24.666388" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:24.667153" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:24.679651" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:24.666915" elapsed="0.015958">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.683343" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.683721" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.684113" 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-07T17:16:24.684481" 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-07T17:16:24.684850" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.685240" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.685834" 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-07T17:16:24.686259" 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-07T17:16:24.686608" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:24.685560" elapsed="0.001163"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.685397" elapsed="0.001386"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.687114" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.687248" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.663347" elapsed="0.024252">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:24.687867" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:24.687992" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:24.662731" elapsed="0.025317"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:24.689495" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.688718" elapsed="0.000910">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:24.688237" elapsed="0.001530">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:24.688197" elapsed="0.001641">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.690018" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.637941" elapsed="0.052304">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.690583" 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-07T17:16:24.690745" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.690805" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:24.635295" elapsed="0.055607">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:24.691081" 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-07T17:16:24.691257" 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-07T17:16:24.691421" 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-07T17:16:24.691577" 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-07T17:16:24.691744" 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-07T17:16:24.691902" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:24.691962" elapsed="0.000029"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:24.632620" elapsed="0.059458">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:25.717103" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:25.716588" elapsed="0.000549"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:25.717624" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:25.717307" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:25.717699" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:16:25.717877" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:25.716115" elapsed="0.001787"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:25.722532" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:25.722336" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:25.722949" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.722707" elapsed="0.000560">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.723437" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.723653" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.723811" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.723983" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.724161" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.724319" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.724488" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.724648" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.734414" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.734605" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.744292" 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-07T17:16:25.744479" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.744546" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.721786" elapsed="0.022895">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:25.744794" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:25.744836" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:25.721222" elapsed="0.023637"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.745144" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:25.744947" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:25.744927" 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-07T17:16:25.746516" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:25.747210" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:25.746880" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:25.748023" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:25.747746" elapsed="0.000303"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:25.748102" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:25.748253" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:25.747416" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:25.748830" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:25.748429" elapsed="0.000426"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:25.749378" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:25.749025" elapsed="0.000378"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:25.749799" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:25.762000" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:25.749560" elapsed="0.014227">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.763983" 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-07T17:16:25.764153" 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-07T17:16:25.764312" 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-07T17:16:25.764472" 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-07T17:16:25.764651" 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-07T17:16:25.764810" 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-07T17:16:25.765100" 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-07T17:16:25.765267" 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-07T17:16:25.765429" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:25.764958" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.764883" 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-07T17:16:25.765649" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.765706" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.745979" elapsed="0.019833">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:25.765925" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:25.765982" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:25.745362" elapsed="0.020645"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:25.766655" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.766338" elapsed="0.000376">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:25.766123" elapsed="0.000652">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:25.766104" elapsed="0.000922">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.767076" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.720611" elapsed="0.046565">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.767350" 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-07T17:16:25.767511" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.767572" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:25.718213" elapsed="0.049456">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:25.767829" 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-07T17:16:25.768020" 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-07T17:16:25.768186" 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-07T17:16:25.768342" 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-07T17:16:25.768501" 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-07T17:16:25.768675" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:25.768736" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:25.715357" elapsed="0.053475">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:26.801861" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:26.801385" elapsed="0.000509"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:26.802393" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:26.802076" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:26.802466" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:16:26.802642" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:26.801000" 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-07T17:16:26.807300" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:26.807112" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:26.807705" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.807471" elapsed="0.000308">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.807940" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.808175" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.808333" elapsed="0.000025"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.808497" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.808670" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.808827" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.809019" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.809176" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.819049" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.819240" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.829008" 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-07T17:16:26.829196" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.829262" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.806563" elapsed="0.022813">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:26.829486" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:26.829529" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:26.806006" elapsed="0.023546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.829755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:26.829641" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:26.829621" 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-07T17:16:26.831129" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:26.831793" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:26.831485" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:26.832632" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:26.832372" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:26.832746" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:26.832900" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:26.832041" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:26.833457" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:26.833094" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:26.833991" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:26.833635" elapsed="0.000382"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:26.834405" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:26.847270" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:26.834173" elapsed="0.016436">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.851044" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.851420" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.851778" 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-07T17:16:26.852228" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.852602" 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-07T17:16:26.852951" elapsed="0.000079"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.853570" 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-07T17:16:26.853950" elapsed="0.000076"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.854335" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:26.853295" elapsed="0.001158"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.853141" elapsed="0.001370"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.854814" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.854946" elapsed="0.000062"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.830580" elapsed="0.024637">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:26.855466" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:26.855562" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:26.829978" elapsed="0.025635"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:26.857032" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.856333" elapsed="0.000759">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:26.855792" elapsed="0.001362">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:26.855752" elapsed="0.001440">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.857238" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.805451" elapsed="0.051884">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.857548" 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-07T17:16:26.857709" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.857770" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:26.803072" elapsed="0.054795">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:26.858046" 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-07T17:16:26.858222" 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-07T17:16:26.858385" 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-07T17:16:26.858540" 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-07T17:16:26.858700" 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-07T17:16:26.858857" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:26.858916" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:26.800249" elapsed="0.058779">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:27.891352" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:27.890858" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:27.891861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:27.891552" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:27.891933" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:16:27.892134" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:27.890481" elapsed="0.001677"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:27.896707" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:27.896515" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:27.897132" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.896882" elapsed="0.000325">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.897368" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.897572" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.897727" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.897886" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.898150" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.898312" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.898484" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.898641" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.908376" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.908566" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.918191" 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-07T17:16:27.918378" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.918443" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.895926" elapsed="0.022633">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:27.918670" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:27.918712" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:27.895371" elapsed="0.023363"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.918934" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:27.918821" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:27.918801" 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-07T17:16:27.920343" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:27.921022" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:27.920700" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:27.922008" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:27.921725" elapsed="0.000312"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:27.922083" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:27.922231" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:27.921234" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:27.922774" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:27.922409" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:27.923316" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:27.922953" elapsed="0.000388"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:27.923749" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:27.935395" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:27.923523" elapsed="0.014086">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.937909" 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-07T17:16:27.938170" 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-07T17:16:27.938397" 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-07T17:16:27.938621" 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-07T17:16:27.938854" 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-07T17:16:27.939096" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.939468" 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-07T17:16:27.939706" 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-07T17:16:27.939941" elapsed="0.000049"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:27.939294" elapsed="0.000744"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.939195" elapsed="0.000881"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.940267" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.940349" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.919768" elapsed="0.020729">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:27.940654" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:27.940714" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:27.919168" elapsed="0.021579"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:27.941631" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.941189" elapsed="0.000528">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:27.940859" elapsed="0.000944">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:27.940834" elapsed="0.001013">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.941910" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.894814" elapsed="0.047253">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.942305" 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-07T17:16:27.942529" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.942615" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:27.892450" elapsed="0.050303">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.943059" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.943303" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.943533" 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-07T17:16:27.943751" 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-07T17:16:27.944051" elapsed="0.000038"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:27.944274" elapsed="0.000025"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:27.944341" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:27.889739" elapsed="0.054700">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:28.975127" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:28.974578" elapsed="0.000585"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:28.975664" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:28.975336" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:28.975739" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:16:28.975930" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:28.974174" 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-07T17:16:28.983219" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:28.983025" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:28.983633" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:28.983394" elapsed="0.000317">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.983873" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984089" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984246" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984414" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984589" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984748" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.984919" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.985091" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.994790" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:28.995054" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:29.005460" 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-07T17:16:29.005653" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.005720" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:28.982476" elapsed="0.023364">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:29.005953" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:29.006011" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:28.981894" elapsed="0.024140"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.006247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:29.006124" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:29.006103" 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-07T17:16:29.007612" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:29.008310" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:29.007985" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:29.009127" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:29.008848" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:29.009200" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:29.009347" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:29.008519" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:29.009889" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:29.009524" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:29.010428" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:29.010084" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:29.010839" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:29.023267" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:29.010607" elapsed="0.014453">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:29.025240" 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-07T17:16:29.025407" 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-07T17:16:29.025566" 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-07T17:16:29.025725" 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-07T17:16:29.025890" 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-07T17:16:29.026065" 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-07T17:16:29.026389" 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-07T17:16:29.026554" 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-07T17:16:29.026709" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:29.026261" elapsed="0.000499"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.026178" 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-07T17:16:29.026926" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.027000" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:29.007076" elapsed="0.020032">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:29.027221" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:29.027263" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:29.006460" elapsed="0.020827"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:29.027896" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:29.027579" elapsed="0.000376">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:29.027369" elapsed="0.000664">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:29.027350" elapsed="0.000724">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.028118" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:28.981345" elapsed="0.046869">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:29.028396" 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-07T17:16:29.028558" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.028617" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:28.976277" elapsed="0.052437">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:29.028875" 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-07T17:16:29.029066" 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-07T17:16:29.029233" 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-07T17:16:29.029390" 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-07T17:16:29.029548" 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-07T17:16:29.029704" elapsed="0.000054"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:29.029802" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:28.973259" elapsed="0.056640">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:30.063293" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:30.062782" elapsed="0.000545"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.063808" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:30.063494" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:30.063881" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:16:30.064074" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:30.062392" 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-07T17:16:30.068682" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:30.068493" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:30.069102" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.068856" elapsed="0.000320">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.069362" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.069562" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.069717" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.069876" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.070068" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.070230" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.070403" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.070561" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.080616" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.080811" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.090611" 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-07T17:16:30.090812" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.090943" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.067940" elapsed="0.023142">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:30.091199" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:30.091244" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.067372" elapsed="0.023896"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.091481" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.091358" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.091337" 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-07T17:16:30.092877" elapsed="0.000230"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.093609" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:30.093287" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:30.094444" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:30.094170" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:30.094516" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:30.094666" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:30.093818" elapsed="0.000872"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.095245" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:30.094862" elapsed="0.000409"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.095764" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:30.095424" elapsed="0.000365"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:30.096187" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:30.108418" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:30.095945" elapsed="0.016232">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.112582" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.112957" elapsed="0.000077"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.113375" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.113782" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.114190" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.114549" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.115154" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.115531" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.115877" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:30.114848" elapsed="0.001173"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.114697" elapsed="0.001384"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.116384" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.116513" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.092332" elapsed="0.024503">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:30.117166" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:30.117266" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.091697" elapsed="0.025621"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.118064" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.117725" elapsed="0.000400">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:30.117506" elapsed="0.000681">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:30.117465" elapsed="0.000754">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.118264" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.066799" elapsed="0.051562">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.118534" 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-07T17:16:30.118696" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.118758" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:30.064414" elapsed="0.054442">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.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-07T17:16:30.119208" 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-07T17:16:30.119371" 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-07T17:16:30.119529" 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-07T17:16:30.119690" 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-07T17:16:30.119848" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.119908" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:30.061635" elapsed="0.058384">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<msg time="2026-04-07T17:16:30.120118" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.307449" elapsed="20.812792">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.120325" elapsed="0.000015"/>
</return>
<var>${original_owner}</var>
<var>${original_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:16:09.305390" elapsed="20.815034">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_candidate}</var>
<arg>${original_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.120598" 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-07T17:16:30.120775" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.120939" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.121131" elapsed="0.000021"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:16:08.802408" elapsed="21.318898">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</test>
<test id="s1-s1-s1-t4" name="Create Bridge Manually and Verify Before Fail" line="36">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:30.125224" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:30.124939" elapsed="0.000565"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.126477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.126367" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.126348" 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-07T17:16:30.131100" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.130992" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.130959" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.132172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:30.131781" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.132651" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:30.132350" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:30.132719" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:30.132871" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:30.131405" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.137932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.137825" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.137807" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.139220" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.139114" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.139097" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:30.139777" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:30.139423" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.140249" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:30.139978" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.178810" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:30.140813" elapsed="0.038172"/>
</kw>
<msg time="2026-04-07T17:16:30.179212" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:30.179258" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.140428" elapsed="0.038867"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.249470" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:30.179853" elapsed="0.069812"/>
</kw>
<msg time="2026-04-07T17:16:30.249835" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:30.249881" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.179467" elapsed="0.070451"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.250236" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.250014" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.249993" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.250858" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:30.250479" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.251243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.251031" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.251012" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:30.251375" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.253702" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:16:30.255142" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:30.256536" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:30.252228" elapsed="0.004723"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:30.251639" elapsed="0.005443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:30.138794" elapsed="0.118386"/>
</kw>
<msg time="2026-04-07T17:16:30.257270" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.257314" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.138161" elapsed="0.119190"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:30.257536" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:30.257426" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.257407" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.258024" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.258349" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.258419" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:30.137493" elapsed="0.121032"/>
</kw>
<msg time="2026-04-07T17:16:30.258616" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.258659" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.133276" elapsed="0.125418"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.259075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.258813" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.258794" elapsed="0.000360"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:30.133140" elapsed="0.126037"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.264376" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.264267" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.264248" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.265712" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.265604" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.265587" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:30.266295" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:30.265919" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.266713" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:30.266473" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.334244" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:30.267290" elapsed="0.067191"/>
</kw>
<msg time="2026-04-07T17:16:30.334708" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:30.334756" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.266897" elapsed="0.067895"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.408727" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:30.335564" elapsed="0.073373"/>
</kw>
<msg time="2026-04-07T17:16:30.409135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:30.409181" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.335100" elapsed="0.074118"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.409575" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.409313" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.409286" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.410227" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:30.409822" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.410595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.410384" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.410366" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:30.410731" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.413467" elapsed="0.000560"/>
</kw>
<kw name="Open 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-07T17:16:30.414985" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:30.416416" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:30.411924" elapsed="0.004901"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:30.411053" elapsed="0.005889"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:30.265299" elapsed="0.151820"/>
</kw>
<msg time="2026-04-07T17:16:30.417214" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.417261" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.264596" elapsed="0.152703"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:30.417488" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:30.417379" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.417360" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.417996" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.418334" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.418407" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:30.263718" elapsed="0.154798"/>
</kw>
<msg time="2026-04-07T17:16:30.418612" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.418658" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.259432" elapsed="0.159265"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.419037" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.418773" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.418756" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:30.259298" elapsed="0.159845"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.424569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.424455" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.424435" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.425819" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:30.425714" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.425696" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:30.426408" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:30.426045" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.426831" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:30.426586" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.477432" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:30.427407" elapsed="0.050184"/>
</kw>
<msg time="2026-04-07T17:16:30.477759" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:30.477806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.427029" elapsed="0.050813"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.548045" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:30.478419" elapsed="0.069839"/>
</kw>
<msg time="2026-04-07T17:16:30.548439" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:30.548484" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.478031" elapsed="0.070489"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.548848" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.548606" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.548583" elapsed="0.000467"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.549589" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:30.549192" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.549952" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.549742" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.549723" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:30.550116" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.552492" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:16:30.553943" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:30.555397" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:30.551012" elapsed="0.004781"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:30.550398" elapsed="0.005511"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:30.425416" elapsed="0.130621"/>
</kw>
<msg time="2026-04-07T17:16:30.556130" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.556175" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.424787" elapsed="0.131424"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:30.556397" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:30.556290" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.556270" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.556871" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.557445" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:30.557517" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:30.424059" elapsed="0.133566"/>
</kw>
<msg time="2026-04-07T17:16:30.557718" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:30.557761" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.419411" elapsed="0.138386"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:30.558145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.557871" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.557854" elapsed="0.000370"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:30.419271" elapsed="0.138977"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:30.132946" elapsed="0.425334"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:30.130618" elapsed="0.427720"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:30.126082" elapsed="0.432313"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:30.125648" elapsed="0.432793"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:30.122631" elapsed="0.435866"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:16:30.566591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:30.566329" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:30.566310" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.566952" 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-07T17:16:30.567071" 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-07T17:16:30.566816" elapsed="0.000281"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.567629" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:16:30.567243" elapsed="0.000432"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.568220" level="INFO">${conn_id} = 43</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-07T17:16:30.567826" elapsed="0.000420"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:30.569143" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:30.569220" 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-07T17:16:30.568843" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.569396" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.570547" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:30.971316" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:08 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:30.570237" elapsed="0.401259"/>
</kw>
<msg time="2026-04-07T17:16:30.971588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.569872" elapsed="0.401806"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:30.568457" elapsed="0.403337"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:30.972377" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:16:31.025279" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:31.025575" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:31.025700" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:30.972101" elapsed="0.053656"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:31.026257" elapsed="0.000556"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.028154" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.027342" elapsed="0.000915"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.028818" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.028478" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.028414" elapsed="0.000652"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:31.029491" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.029203" elapsed="0.000463"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.029163" elapsed="0.000561"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.029801" elapsed="0.000043"/>
</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-07T17:16:31.036021" elapsed="0.000543"/>
</kw>
<kw name="Open 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-07T17:16:31.036725" elapsed="0.000162"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:31.037046" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.030663" elapsed="0.006532"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:30.565744" elapsed="0.471598"/>
</kw>
<msg time="2026-04-07T17:16:31.037395" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:30.565198" elapsed="0.472245"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:30.564689" elapsed="0.472832"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.038043" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.037701" elapsed="0.000369"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.038533" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.038243" elapsed="0.000316"/>
</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-07T17:16:31.048197" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:31.047796" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.048677" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:31.048378" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:31.048744" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:31.048895" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.047432" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.054713" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.054362" elapsed="0.000379"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.054789" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:16:31.054980" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.053951" elapsed="0.001057"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.061949" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.061668" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.062453" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.062181" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.081911" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.082383" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.082604" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.064647" elapsed="0.018053"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.062590" elapsed="0.020208"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.083232" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.082857" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.062569" elapsed="0.020856"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.089762" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.085717" elapsed="0.004134"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.085218" elapsed="0.004683"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.085177" elapsed="0.004760"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.093385" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.090412" elapsed="0.003037"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.090040" elapsed="0.003457"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.090014" elapsed="0.003518"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.094311" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.093756" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.094802" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.094446" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.095576" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.095156" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.094917" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.094420" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.096437" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.095901" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.096885" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.096570" elapsed="0.000412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.097641" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.097232" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.097018" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.096545" elapsed="0.001210"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.097954" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.099142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.098702" elapsed="0.000488"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.099429" elapsed="0.002263"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.084244" elapsed="0.017515"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.101932" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.101828" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.101810" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.102180" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.102250" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:31.104369" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.055383" elapsed="0.049013"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.104448" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:31.104594" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:31.053406" elapsed="0.051212"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.105795" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.105404" elapsed="0.000463"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.105253" elapsed="0.000652"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.105120" elapsed="0.000816"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.104841" elapsed="0.001164"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:31.049141" elapsed="0.056900"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.111671" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.111352" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.111796" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:31.111959" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.110986" elapsed="0.001024"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.118529" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.118258" elapsed="0.000339"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.119069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.118774" elapsed="0.000351"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.146294" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.146566" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.146792" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.121242" elapsed="0.025609"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.119195" elapsed="0.027802"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.147522" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.147096" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.119176" elapsed="0.028585"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.155994" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.150415" elapsed="0.005667"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.149835" elapsed="0.006306"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.149791" elapsed="0.006385"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.159810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.156580" elapsed="0.003295"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.156253" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.156230" elapsed="0.003773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.160851" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.160257" elapsed="0.000633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.161398" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.161019" elapsed="0.000466"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.162271" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.161763" elapsed="0.000547"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.161519" elapsed="0.000849"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.160985" elapsed="0.001427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.163282" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.162681" elapsed="0.000639"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.163770" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.163419" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.164623" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.164180" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.163907" elapsed="0.000829"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.163394" elapsed="0.001374"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.165004" elapsed="0.000527"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.166254" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.165778" elapsed="0.000515"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.166556" elapsed="0.002881"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.148716" elapsed="0.020785"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.169755" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.169642" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.169621" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.170027" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.170120" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:16:31.172387" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.112358" elapsed="0.060058"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.172467" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:31.172636" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:31.110415" elapsed="0.062248"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.173938" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.173530" elapsed="0.000512"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.173358" elapsed="0.000726"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.173218" elapsed="0.000896"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.172915" elapsed="0.001251"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:31.106127" elapsed="0.068084"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.179836" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.179511" elapsed="0.000353"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.179910" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:31.180106" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.179128" elapsed="0.001005"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.186813" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.186536" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.187363" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.187076" elapsed="0.000331"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.210848" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.211207" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.211517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.189560" elapsed="0.022028"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.187489" elapsed="0.024199"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.212226" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.211773" elapsed="0.000644"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.187463" elapsed="0.025007"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.221224" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.215385" elapsed="0.005954"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.214804" elapsed="0.006628"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.214755" elapsed="0.006740"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.225400" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.222243" elapsed="0.003221"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.221627" elapsed="0.003884"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.221587" elapsed="0.003958"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.226321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.225761" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.226878" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.226541" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.227833" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.227391" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.227020" elapsed="0.000899"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.226510" elapsed="0.001440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.228716" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.228206" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.229188" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.228850" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.229921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.229513" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.229302" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.228825" elapsed="0.001232"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.230260" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.231383" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.231000" elapsed="0.000420"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.231625" elapsed="0.003021"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.213478" elapsed="0.021278"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.234986" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.234862" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.234838" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.235217" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.235286" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:16:31.237383" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.180479" elapsed="0.056932"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.237460" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:31.237607" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:31.178576" elapsed="0.059056"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.238834" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.238457" elapsed="0.000444"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.238305" elapsed="0.000635"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.238124" elapsed="0.000862"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.237850" elapsed="0.001189"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:31.174311" elapsed="0.064761"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:31.048994" elapsed="0.190106"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.046851" elapsed="0.192299"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:16:31.038746" elapsed="0.200458"/>
</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-07T17:16:31.250446" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:31.249796" elapsed="0.000689"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.251350" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:31.250756" elapsed="0.000641"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:31.251452" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:31.251606" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.249276" elapsed="0.002366"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.258807" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.258503" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.258880" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:31.259047" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.258148" elapsed="0.000924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.267246" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.266985" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.267697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.267446" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.277203" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.279256" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.279431" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.269751" elapsed="0.009716"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.267813" elapsed="0.011712"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.279771" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.279562" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.267792" elapsed="0.012097"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.284694" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.281299" elapsed="0.003540"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.280995" elapsed="0.003893"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.280951" elapsed="0.003972"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.287894" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.285328" elapsed="0.002611"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.285021" elapsed="0.002966"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.284996" elapsed="0.003017"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.288560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.288178" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.288890" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.288655" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.289441" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.289142" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.288985" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.288638" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.290047" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.289675" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.290385" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.290154" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.290912" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.290617" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.290465" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.290124" elapsed="0.000888"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.291158" elapsed="0.000347"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.291952" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.291662" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.292144" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.280394" elapsed="0.014193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.294780" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.294659" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.294640" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.295049" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.295128" elapsed="0.000019"/>
</return>
<msg time="2026-04-07T17:16:31.297444" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.259394" elapsed="0.038081"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.297528" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:31.297693" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:31.257640" elapsed="0.040082"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.299024" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.298600" elapsed="0.000514"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.298441" elapsed="0.000714"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.298292" elapsed="0.000898"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.297979" elapsed="0.001266"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:31.251824" elapsed="0.047493"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.304798" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.304469" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.304873" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:31.305050" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.304109" elapsed="0.000969"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.311291" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.311041" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.311722" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.311483" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.345607" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.347227" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.347368" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.313714" elapsed="0.033682"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.311830" elapsed="0.035615"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.347658" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.347476" elapsed="0.000247"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.311811" elapsed="0.035933"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.351462" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.348844" elapsed="0.002732"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.348592" elapsed="0.003020"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.348572" elapsed="0.003065"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.354119" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.351916" elapsed="0.002251"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.351692" elapsed="0.002511"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.351676" elapsed="0.002552"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.354855" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.354398" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.355351" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.355027" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.356115" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.355677" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.355464" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.355000" elapsed="0.001232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.356951" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.356441" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.357425" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.357107" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.358190" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.357749" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.357537" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.357081" elapsed="0.001224"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.358508" elapsed="0.000497"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.359620" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.359228" elapsed="0.000428"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.359862" elapsed="0.003101"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.348138" elapsed="0.014939"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.363322" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.363174" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.363148" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.363643" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.363744" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:16:31.366842" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.305427" elapsed="0.061455"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.366952" elapsed="0.000057"/>
</return>
<msg time="2026-04-07T17:16:31.367180" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:31.303581" elapsed="0.063634"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.368844" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.368313" elapsed="0.000644"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.368105" elapsed="0.000928"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.367894" elapsed="0.001182"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.367526" elapsed="0.001625"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:31.299413" elapsed="0.069833"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.378383" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.377570" elapsed="0.000877"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:31.378557" elapsed="0.000068"/>
</return>
<msg time="2026-04-07T17:16:31.378888" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.376711" elapsed="0.002205"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.385243" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.384993" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.385677" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.385437" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:31.411271" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:31.411695" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:31.412013" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:31.387697" elapsed="0.024384"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.385788" elapsed="0.026410"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.412602" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.412259" elapsed="0.000485"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.385768" elapsed="0.027025"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.418620" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.415099" elapsed="0.003667"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.414709" elapsed="0.004109"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.414680" elapsed="0.004175"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.422761" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.419312" elapsed="0.003531"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.418937" elapsed="0.003971"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.418912" elapsed="0.004036"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.423864" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.423232" elapsed="0.000682"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.424452" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.424066" elapsed="0.000477"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.425404" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.424851" elapsed="0.000604"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.424589" elapsed="0.000924"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.424033" elapsed="0.001512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.426529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.425806" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.426935" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.426682" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.427539" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:31.427221" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:31.427049" elapsed="0.000552"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.426650" elapsed="0.000973"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.427795" elapsed="0.000409"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:31.428674" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:31.428371" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.428868" elapsed="0.002268"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:31.413600" elapsed="0.017611"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:31.431403" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.431284" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.431265" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.431648" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.431727" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:31.434156" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:31.379276" elapsed="0.054909"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:31.434237" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:31.434401" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:31.375482" elapsed="0.058946"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.435689" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:31.435282" elapsed="0.000493"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:31.435127" elapsed="0.000697"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:31.434957" elapsed="0.000898"/>
</for>
<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="PASS" start="2026-04-07T17:16:31.434669" elapsed="0.001240"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:31.369375" elapsed="0.066625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:31.251692" elapsed="0.184351"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.248430" elapsed="0.187669"/>
</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_operational}</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-07T17:16:31.239424" elapsed="0.196731"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:16:30.562571" elapsed="0.873662"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:16:30.122010" elapsed="1.314361"/>
</test>
<test id="s1-s1-s1-t5" name="Add Port Manually and Verify Before Fail" line="40">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:31.440076" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:31.439765" elapsed="0.000598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.441442" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.441327" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.441307" 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-07T17:16:31.446353" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.446233" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.446215" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.447503" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:31.447081" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.448037" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:31.447701" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:31.448109" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:31.448278" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.446661" elapsed="0.001642"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.453682" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.453566" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.453546" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.455146" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.455022" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.455002" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:31.455747" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.455366" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.456246" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:31.455945" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.493992" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:31.456866" elapsed="0.037323"/>
</kw>
<msg time="2026-04-07T17:16:31.494369" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:31.494428" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.456441" elapsed="0.038028"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.562235" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:31.495130" elapsed="0.067319"/>
</kw>
<msg time="2026-04-07T17:16:31.562667" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:31.562773" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.494659" elapsed="0.068160"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.563168" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.562905" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.562881" elapsed="0.000395"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.563800" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.563417" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.564184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.563952" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.563934" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:31.564335" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.566767" elapsed="0.000538"/>
</kw>
<kw name="Open 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-07T17:16:31.568263" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:31.569718" elapsed="0.000351"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.565258" elapsed="0.004883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:31.564645" elapsed="0.005614"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:31.454668" elapsed="0.115693"/>
</kw>
<msg time="2026-04-07T17:16:31.570454" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.570498" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.453945" elapsed="0.116590"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:31.570719" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.570612" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.570593" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.571211" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.571547" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.571619" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:31.453196" elapsed="0.118530"/>
</kw>
<msg time="2026-04-07T17:16:31.571820" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.571863" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.448687" elapsed="0.123214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.572265" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.572006" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.571959" elapsed="0.000390"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:31.448534" elapsed="0.123839"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.578275" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.578157" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.578135" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.579634" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.579519" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.579501" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:31.580321" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.579900" elapsed="0.000452"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.580785" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:31.580519" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.621307" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:31.581410" elapsed="0.040126"/>
</kw>
<msg time="2026-04-07T17:16:31.621725" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:31.621772" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.580995" elapsed="0.040815"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.693239" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:31.622438" elapsed="0.071007"/>
</kw>
<msg time="2026-04-07T17:16:31.693619" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:31.693665" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.622014" elapsed="0.071688"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.694062" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.693795" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.693769" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.694690" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.694307" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.695073" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.694844" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.694826" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:31.695210" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.697817" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:16:31.699273" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:31.700659" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.696359" elapsed="0.004715"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:31.695514" elapsed="0.005691"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:31.579200" elapsed="0.122105"/>
</kw>
<msg time="2026-04-07T17:16:31.701396" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.701439" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.578509" elapsed="0.122967"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:31.701660" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.701554" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.701535" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.702156" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.702546" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.702618" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:31.577771" elapsed="0.124954"/>
</kw>
<msg time="2026-04-07T17:16:31.702817" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.702860" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.572641" elapsed="0.130256"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.703243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.702999" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.702953" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:31.572498" elapsed="0.130846"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.708606" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.708492" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.708473" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.709854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:31.709747" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.709730" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:31.710433" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.710074" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.710856" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:31.710616" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.746753" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:31.711508" elapsed="0.035421"/>
</kw>
<msg time="2026-04-07T17:16:31.747116" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:31.747161" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.711126" elapsed="0.036072"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.810347" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:31.747746" elapsed="0.062975"/>
</kw>
<msg time="2026-04-07T17:16:31.811003" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:31.811054" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.747363" elapsed="0.063729"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.811580" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.811228" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.811183" elapsed="0.000507"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.812350" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:31.811839" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.812716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.812505" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.812486" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:31.812851" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.815532" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:31.817057" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:31.818498" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:31.813984" elapsed="0.004921"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:31.813314" elapsed="0.005727"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:31.709449" elapsed="0.109710"/>
</kw>
<msg time="2026-04-07T17:16:31.819263" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.819309" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.708817" elapsed="0.110530"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:31.819536" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:31.819427" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.819408" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.820093" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.820777" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:31.820851" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:31.708148" elapsed="0.112895"/>
</kw>
<msg time="2026-04-07T17:16:31.821145" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:31.821188" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.703609" elapsed="0.117616"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:31.821552" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.821302" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.821284" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:31.703474" elapsed="0.118179"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:31.448355" elapsed="0.373334"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:31.445825" elapsed="0.375928"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:31.441007" elapsed="0.380807"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:31.440525" elapsed="0.381338"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:31.437402" elapsed="0.384519"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:16:31.830138" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:31.829854" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:31.829836" elapsed="0.000382"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.830517" 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-07T17:16:31.830621" 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-07T17:16:31.830367" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.831187" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:16:31.830793" elapsed="0.000477"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.831797" level="INFO">${conn_id} = 48</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-07T17:16:31.831425" elapsed="0.000398"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:31.832735" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:31.832811" 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-07T17:16:31.832444" elapsed="0.000390"/>
</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-07T17:16:31.833032" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:31.834202" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:32.156343" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:30 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:31.833871" elapsed="0.322649"/>
</kw>
<msg time="2026-04-07T17:16:32.156617" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.833520" elapsed="0.323187"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:31.832052" elapsed="0.324771"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.157354" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:16:32.220399" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:32.220657" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:32.220756" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:32.157086" elapsed="0.063725"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:32.221251" elapsed="0.000474"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.222807" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.222164" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.223409" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.223119" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.223065" elapsed="0.000504"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:32.223917" elapsed="0.000087"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.223687" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.223654" elapsed="0.000500"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.224228" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.229859" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:16:32.230617" elapsed="0.000215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:32.231055" elapsed="0.000137"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.224915" elapsed="0.006347"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:31.829331" elapsed="0.402054"/>
</kw>
<msg time="2026-04-07T17:16:32.231457" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:31.828745" elapsed="0.402777"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:31.828238" elapsed="0.403474"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.232494" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.232014" elapsed="0.000516"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.233206" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.232773" elapsed="0.000469"/>
</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-07T17:16:32.245056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:32.244654" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.245544" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:32.245241" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:32.245613" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:32.245766" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:32.244286" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.251123" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.250811" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.251194" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.251337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.250464" elapsed="0.000897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.257699" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.257449" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.258152" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.257892" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.267800" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.267949" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.268084" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.260163" elapsed="0.007947"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.258262" elapsed="0.009889"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.268331" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.268178" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.258243" elapsed="0.010174"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.271644" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.269446" elapsed="0.002243"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.269225" elapsed="0.002497"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.269207" elapsed="0.002540"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.274722" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.272053" elapsed="0.002730"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.271801" elapsed="0.003028"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.271785" elapsed="0.003078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.275627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.275098" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.276112" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.275758" elapsed="0.000481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.276923" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.276497" elapsed="0.000462"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.276277" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.275733" elapsed="0.001328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.277772" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.277272" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.278241" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.277903" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.278995" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.278564" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.278353" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.277879" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.279311" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.280467" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.280045" elapsed="0.000458"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.280712" elapsed="0.003057"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.268777" elapsed="0.015079"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.284179" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.284015" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.283987" elapsed="0.000332"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.284544" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.284643" elapsed="0.000021"/>
</return>
<msg time="2026-04-07T17:16:32.286823" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.251696" elapsed="0.035154"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.286904" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:32.287068" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:32.249974" elapsed="0.037119"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.288285" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.287868" elapsed="0.000499"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.287720" elapsed="0.000687"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.287591" elapsed="0.000846"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.287316" elapsed="0.001174"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:32.246026" elapsed="0.042497"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.293951" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.293646" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.294039" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:32.294187" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.293305" elapsed="0.000906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.300495" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.300246" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.300924" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.300685" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.315154" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.315260" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.315353" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.302975" elapsed="0.012404"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.301051" elapsed="0.014371"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.315599" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.315448" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.301032" elapsed="0.014652"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.322773" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.317787" elapsed="0.005092"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.317303" elapsed="0.005701"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.317263" elapsed="0.005810"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.326569" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.323682" elapsed="0.002932"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.323198" elapsed="0.003450"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.323161" elapsed="0.003511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.327214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.326828" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.327534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.327309" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.328098" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.327767" elapsed="0.000357"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.327615" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.327292" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.328685" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.328329" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.329017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.328779" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.329536" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.329248" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.329098" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.328761" elapsed="0.000856"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.329759" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.330541" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.330268" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.330712" elapsed="0.002274"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.316289" elapsed="0.016760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.333221" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.333118" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.333100" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.333443" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.333512" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:32.335613" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.294536" elapsed="0.041137"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.335726" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.335901" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:32.292780" elapsed="0.043146"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.337098" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.336703" elapsed="0.000465"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.336557" elapsed="0.000651"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.336425" elapsed="0.000812"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.336165" elapsed="0.001124"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:32.288609" elapsed="0.048713"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.342442" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.342149" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.342513" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.342657" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.341788" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.348809" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.348566" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.349255" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.349014" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.364202" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.364343" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.364470" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.351253" elapsed="0.013252"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.349365" elapsed="0.015199"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.364805" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.364599" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.349346" elapsed="0.015577"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.371558" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.366401" elapsed="0.005223"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.366021" elapsed="0.005651"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.365995" elapsed="0.005712"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.375090" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.372147" elapsed="0.003006"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.371815" elapsed="0.003385"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.371789" elapsed="0.003445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.376003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.375448" elapsed="0.000594"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.376461" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.376141" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.377239" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.376784" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.376573" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.376115" elapsed="0.001286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.378151" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.377620" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.378601" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.378285" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.379353" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.378924" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.378713" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.378260" elapsed="0.001208"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.379667" elapsed="0.000517"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.380779" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.380404" elapsed="0.000410"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.381043" elapsed="0.003033"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.365417" elapsed="0.018747"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.384404" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.384260" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.384234" elapsed="0.000286"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.384716" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.384813" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:16:32.386996" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.343011" elapsed="0.044013"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.387075" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.387221" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:32.341309" elapsed="0.045937"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.388398" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.388031" elapsed="0.000431"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.387866" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.387736" elapsed="0.000795"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.387463" elapsed="0.001119"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:32.337408" elapsed="0.051208"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:32.245852" elapsed="0.142791"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:32.243700" elapsed="0.144990"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:16:32.233490" elapsed="0.155250"/>
</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-07T17:16:32.398463" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:32.397918" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.398950" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:32.398646" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:32.399044" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:32.399198" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:32.397552" elapsed="0.001671"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.404494" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.404200" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.404566" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.404709" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.403840" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.410979" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.410718" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.411418" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.411177" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.421682" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.423929" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.424108" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.413427" elapsed="0.010718"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.411529" elapsed="0.012675"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.424448" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.424240" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.411510" elapsed="0.013056"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.429168" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.425933" elapsed="0.003366"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.425636" elapsed="0.003712"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.425611" elapsed="0.003772"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.432570" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.429763" elapsed="0.002852"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.429460" elapsed="0.003189"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.429436" elapsed="0.003245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.433223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.432835" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.433548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.433319" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.434096" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.433783" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.433630" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.433301" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.434735" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.434368" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.435074" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.434830" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.435601" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.435306" elapsed="0.000574"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.435155" elapsed="0.000778"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.434812" elapsed="0.001147"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.436145" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.436927" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.436657" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.437124" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.425057" elapsed="0.014240"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.439468" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.439365" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.439347" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.439705" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.439774" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:32.441993" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.405060" elapsed="0.036963"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.442074" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.442221" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:32.403357" elapsed="0.038890"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.443379" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.443009" elapsed="0.000447"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.442850" elapsed="0.000645"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.442722" elapsed="0.000802"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.442464" elapsed="0.001111"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:32.399444" elapsed="0.044239"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.449084" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.448725" elapsed="0.000392"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.449162" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:32.449320" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.448372" elapsed="0.000973"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.455540" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.455282" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.456011" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.455755" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.473521" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.474170" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.474425" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.458068" elapsed="0.016414"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.456123" elapsed="0.018456"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.474995" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.474636" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.456104" elapsed="0.019085"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.482674" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.477461" elapsed="0.005430"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.476951" elapsed="0.006048"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.476911" elapsed="0.006149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.486055" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.483715" elapsed="0.002385"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.483184" elapsed="0.002950"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.483146" elapsed="0.003013"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.486678" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.486312" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.487015" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.486774" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.487553" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.487249" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.487096" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.486756" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.488160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.487786" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.488486" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.488260" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.489038" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.488718" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.488566" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.488242" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.489264" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.490046" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.489761" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.490218" elapsed="0.002256"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.476018" elapsed="0.016519"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.492713" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.492605" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.492587" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.492938" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.493024" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:32.495244" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.449665" elapsed="0.045607"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.495321" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:32.495469" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:32.447866" elapsed="0.047653"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.496666" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.496298" elapsed="0.000443"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.496152" elapsed="0.000628"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.496022" elapsed="0.000787"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.495742" elapsed="0.001119"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:32.443777" elapsed="0.053151"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.502233" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.501903" elapsed="0.000393"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:32.502352" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:32.502508" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.501563" elapsed="0.000969"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.508824" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.508575" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.509271" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.509031" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:32.524938" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:32.525455" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:32.525704" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:32.511279" elapsed="0.014481"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.509384" elapsed="0.016469"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.526273" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.525911" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.509364" elapsed="0.017100"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.534383" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.528745" elapsed="0.005856"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.528256" elapsed="0.006424"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.528215" elapsed="0.006522"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.537909" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.535384" elapsed="0.002570"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.534863" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.534825" elapsed="0.003203"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.538573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.538191" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.538898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.538669" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.539463" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.539155" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.538999" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.538651" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.540072" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.539697" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.540392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.540168" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.540914" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:32.540624" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:32.540472" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.540150" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.541157" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:32.541935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:32.541658" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.542124" elapsed="0.002140"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:32.527263" elapsed="0.017062"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:32.544495" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.544392" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.544374" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.544720" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.544789" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:16:32.547033" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:32.502861" elapsed="0.044200"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:32.547111" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:32.547260" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:32.501048" elapsed="0.046237"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.548465" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:32.548089" elapsed="0.000455"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:16:32.547926" elapsed="0.000657"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:32.547792" elapsed="0.000821"/>
</for>
<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="PASS" start="2026-04-07T17:16:32.547529" elapsed="0.001135"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:32.497036" elapsed="0.051699"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:32.399311" elapsed="0.149456"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:32.396991" elapsed="0.151828"/>
</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_operational}</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-07T17:16:32.388927" elapsed="0.159946"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:16:31.826096" elapsed="0.722840"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:16:31.436617" elapsed="1.112462"/>
</test>
<test id="s1-s1-s1-t6" name="Create Tap Device Before Fail" line="44">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:32.552351" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:32.552094" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.553621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.553511" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.553492" 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-07T17:16:32.558434" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.558328" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.558311" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.559504" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:32.559100" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.559997" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:32.559683" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:32.560068" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:32.560222" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:32.558720" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.565266" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.565159" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.565141" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.566561" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.566454" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.566437" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:32.567144" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.566765" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.567631" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:32.567324" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.621529" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:32.568206" elapsed="0.053647"/>
</kw>
<msg time="2026-04-07T17:16:32.622199" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:32.622266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.567809" elapsed="0.054509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.673915" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:32.623371" elapsed="0.050776"/>
</kw>
<msg time="2026-04-07T17:16:32.674319" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:32.674365" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.622650" elapsed="0.051844"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.674863" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.674600" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.674569" elapsed="0.000420"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.675539" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.675151" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.675936" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.675706" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.675679" elapsed="0.000388"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:32.676106" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.678669" elapsed="0.000553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.680185" elapsed="0.000726"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:32.681865" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.677117" elapsed="0.005173"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:32.676445" elapsed="0.005961"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:32.566156" elapsed="0.116351"/>
</kw>
<msg time="2026-04-07T17:16:32.682601" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.682644" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.565485" elapsed="0.117196"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:32.682866" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.682759" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.682740" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.683459" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.683870" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.683953" elapsed="0.000035"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:32.564813" elapsed="0.119285"/>
</kw>
<msg time="2026-04-07T17:16:32.684193" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.684236" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.560593" elapsed="0.123681"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.684596" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.684350" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.684333" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:32.560458" elapsed="0.124239"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.689962" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.689851" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.689832" elapsed="0.000242"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.691448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.691339" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.691322" elapsed="0.000230"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:32.692087" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.691697" elapsed="0.000416"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.692518" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:32.692269" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.736808" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:32.693127" elapsed="0.043987"/>
</kw>
<msg time="2026-04-07T17:16:32.737285" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:32.737331" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.692698" elapsed="0.044670"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.793673" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:32.737925" elapsed="0.056022"/>
</kw>
<msg time="2026-04-07T17:16:32.794199" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:32.794249" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.737536" elapsed="0.056752"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.794723" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.794411" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.794371" elapsed="0.000464"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.795515" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.795028" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.795880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.795667" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.795648" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:32.796034" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.798532" elapsed="0.000828"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.800375" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:32.801808" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.797021" elapsed="0.005198"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:32.796362" elapsed="0.005970"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:32.690841" elapsed="0.111593"/>
</kw>
<msg time="2026-04-07T17:16:32.802544" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.802589" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.690221" elapsed="0.112406"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:32.802813" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.802707" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.802687" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.803342" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.804017" elapsed="0.000090"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.804159" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:32.689503" elapsed="0.114783"/>
</kw>
<msg time="2026-04-07T17:16:32.804382" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.804426" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.685043" elapsed="0.119419"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.804784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.804539" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.804522" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:32.684837" elapsed="0.120047"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.810265" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.810153" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.810134" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.811518" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:32.811413" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.811395" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:32.812185" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:32.811722" elapsed="0.000490"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.812609" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:32.812364" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.847748" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:32.813183" elapsed="0.034719"/>
</kw>
<msg time="2026-04-07T17:16:32.848104" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:32.848150" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.812788" elapsed="0.035398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.902603" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:32.848740" elapsed="0.054067"/>
</kw>
<msg time="2026-04-07T17:16:32.902992" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:32.903045" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.848356" elapsed="0.054726"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.903376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.903159" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.903139" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.903998" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:32.903614" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.904354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.904145" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.904127" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:32.904483" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.906752" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:16:32.908229" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:32.909599" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:32.905323" elapsed="0.004675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:32.904736" elapsed="0.005377"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:32.811113" elapsed="0.099099"/>
</kw>
<msg time="2026-04-07T17:16:32.910304" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.910347" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.810476" elapsed="0.099907"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:32.910564" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:32.910459" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.910440" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.911067" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.911390" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:32.911460" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:32.809743" elapsed="0.101822"/>
</kw>
<msg time="2026-04-07T17:16:32.911656" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:32.911700" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.805191" elapsed="0.106546"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:32.912084" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.911809" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.911793" elapsed="0.000368"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:32.805051" elapsed="0.107133"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:32.560295" elapsed="0.351919"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:32.557958" elapsed="0.354320"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:32.553213" elapsed="0.359129"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:32.552754" elapsed="0.359638"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:32.550092" elapsed="0.362358"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:16:32.915116" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:32.914833" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:32.914814" elapsed="0.000381"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.915504" 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-07T17:16:32.915622" 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-07T17:16:32.915340" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.916419" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:16:32.915802" elapsed="0.000663"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.917042" level="INFO">${conn_id} = 53</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-07T17:16:32.916656" elapsed="0.000413"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:32.917959" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:32.918056" 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-07T17:16:32.917674" elapsed="0.000407"/>
</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-07T17:16:32.918234" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:32.919456" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:33.244992" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:32 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:32.919116" elapsed="0.326003"/>
</kw>
<msg time="2026-04-07T17:16:33.245193" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.918725" elapsed="0.326548"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:32.917282" elapsed="0.328095"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.245857" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:16:33.258108" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:16:33.258352" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:33.258447" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:33.245602" elapsed="0.012895"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.258850" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.260460" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:33.259773" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.261068" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:33.260740" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.260687" elapsed="0.000566"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:33.261606" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:16:33.261373" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.261339" elapsed="0.000462"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.261875" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.268101" elapsed="0.000569"/>
</kw>
<kw name="Open 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-07T17:16:33.269000" elapsed="0.000277"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.269502" elapsed="0.000175"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:33.262601" elapsed="0.007173"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:32.914289" elapsed="0.355650"/>
</kw>
<msg time="2026-04-07T17:16:33.270080" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:32.913539" elapsed="0.356679"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:32.913055" elapsed="0.357299"/>
</kw>
<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-07T17:16:33.273550" elapsed="0.000162"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:33.273179" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.273152" elapsed="0.000650"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.274271" 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-07T17:16:33.274414" 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-07T17:16:33.274042" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.275221" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:16:33.274655" elapsed="0.000630"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.276026" level="INFO">${conn_id} = 55</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-07T17:16:33.275499" elapsed="0.000567"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.277358" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:33.277462" 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-07T17:16:33.276944" elapsed="0.000551"/>
</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-07T17:16:33.277708" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.279452" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:33.607406" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:33 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:33.279052" elapsed="0.328602"/>
</kw>
<msg time="2026-04-07T17:16:33.607811" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.278466" elapsed="0.329488"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:33.276399" elapsed="0.331799"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.609153" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:16:33.622039" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:16:33.622185" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:33.622279" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:33.608652" elapsed="0.013676"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.622684" elapsed="0.000958"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.624716" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:33.624075" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.625370" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:33.625055" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.625001" elapsed="0.000527"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:33.625873" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:16:33.625647" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.625613" elapsed="0.000510"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.626220" elapsed="0.000041"/>
</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-07T17:16:33.632477" elapsed="0.000844"/>
</kw>
<kw name="Open 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-07T17:16:33.633721" elapsed="0.000215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.634104" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:33.627023" elapsed="0.007230"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:33.272433" elapsed="0.361985"/>
</kw>
<msg time="2026-04-07T17:16:33.634473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.271585" elapsed="0.362935"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:33.270713" elapsed="0.363885"/>
</kw>
<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-07T17:16:33.636697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:33.636421" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.636403" elapsed="0.000376"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.637086" 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-07T17:16:33.637190" 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-07T17:16:33.636926" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.637752" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:16:33.637371" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.638328" level="INFO">${conn_id} = 57</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-07T17:16:33.637945" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.639414" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:33.639489" 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-07T17:16:33.639129" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.639663" elapsed="0.000345"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.640835" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:33.967783" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:33 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:33.640518" elapsed="0.327395"/>
</kw>
<msg time="2026-04-07T17:16:33.968012" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.640171" elapsed="0.327917"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:33.638559" elapsed="0.329636"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.968692" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:16:33.980986" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:16:33.981103" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:33.981147" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:33.968437" elapsed="0.012733"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.981489" elapsed="0.000430"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.982992" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:33.982355" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.983557" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:33.983267" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.983217" elapsed="0.000612"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:33.984215" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:16:33.983950" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.983916" elapsed="0.000483"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:33.984472" elapsed="0.000030"/>
</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-07T17:16:33.990347" elapsed="0.000732"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:33.991432" elapsed="0.000325"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:33.992106" elapsed="0.000211"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:33.985202" elapsed="0.007227"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:33.635877" elapsed="0.356745"/>
</kw>
<msg time="2026-04-07T17:16:33.992785" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.635313" elapsed="0.357578"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:33.634799" elapsed="0.358292"/>
</kw>
<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-07T17:16:33.995336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:33.995061" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:33.995042" elapsed="0.000380"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.995706" 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-07T17:16:33.995809" 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-07T17:16:33.995566" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.996370" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:16:33.995993" elapsed="0.000421"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.996949" level="INFO">${conn_id} = 59</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-07T17:16:33.996567" elapsed="0.000424"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:33.997872" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:33.997947" 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-07T17:16:33.997592" elapsed="0.000398"/>
</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-07T17:16:33.998144" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:33.999312" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:34.370667" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:33 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:33.998998" elapsed="0.371793"/>
</kw>
<msg time="2026-04-07T17:16:34.370861" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.998635" elapsed="0.372298"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:33.997201" elapsed="0.373946"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.371619" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:16:34.384097" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:16:34.384215" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:34.384259" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:34.371382" elapsed="0.012901"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:34.384630" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.386169" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:34.385548" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.386734" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.386435" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.386387" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:34.387270" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:16:34.387035" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.387000" elapsed="0.000482"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.387559" elapsed="0.000030"/>
</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-07T17:16:34.393562" elapsed="0.000724"/>
</kw>
<kw name="Open 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-07T17:16:34.394640" elapsed="0.000356"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:34.395319" elapsed="0.000212"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:34.388286" elapsed="0.007356"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:33.994515" elapsed="0.401325"/>
</kw>
<msg time="2026-04-07T17:16:34.395954" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:33.993928" elapsed="0.402205"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:33.993366" elapsed="0.402946"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:16:32.912679" elapsed="1.483756"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:16:32.549523" elapsed="1.847040"/>
</test>
<test id="s1-s1-s1-t7" name="Add Tap Device Manually and Verify Before Fail" 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-07T17:16:34.400073" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:34.399791" 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-07T17:16:34.401319" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.401209" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.401190" 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-07T17:16:34.405959" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.405852" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.405835" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.407032" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:34.406635" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.407516" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:34.407215" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:34.407584" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:34.407735" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:34.406262" elapsed="0.001497"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.413120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.413010" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.412991" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.414427" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.414320" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.414302" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:34.415047" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:34.414639" elapsed="0.000435"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.415488" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:34.415229" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.451024" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:34.416103" elapsed="0.035109"/>
</kw>
<msg time="2026-04-07T17:16:34.451386" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:34.451434" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.415669" elapsed="0.035802"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.519685" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:34.452086" elapsed="0.067813"/>
</kw>
<msg time="2026-04-07T17:16:34.520092" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:34.520138" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.451642" elapsed="0.068532"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.520483" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.520254" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.520232" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.521132" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:34.520724" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.521496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.521285" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.521268" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:34.521627" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:34.523997" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:34.525469" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:34.526883" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:34.522498" elapsed="0.004794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:34.521902" elapsed="0.005505"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:34.414022" elapsed="0.113484"/>
</kw>
<msg time="2026-04-07T17:16:34.527596" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.527639" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.413334" elapsed="0.114342"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:34.527926" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:34.527817" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.527794" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.528424" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.528754" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.528824" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:34.412664" elapsed="0.116267"/>
</kw>
<msg time="2026-04-07T17:16:34.529053" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.529099" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.408232" elapsed="0.120905"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.529459" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.529213" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.529196" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:34.408092" elapsed="0.121466"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.535082" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.534959" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.534940" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.536376" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.536269" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.536250" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:34.536934" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:34.536581" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.537376" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:34.537130" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.576752" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:34.537934" elapsed="0.038977"/>
</kw>
<msg time="2026-04-07T17:16:34.577102" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:34.577148" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.537556" elapsed="0.039628"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.666347" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:34.577738" elapsed="0.088845"/>
</kw>
<msg time="2026-04-07T17:16:34.666781" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:34.666827" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.577352" elapsed="0.089511"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.667248" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.666959" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.666930" elapsed="0.000425"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.667931" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:34.667495" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.668374" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.668163" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.668144" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:34.668512" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:34.670905" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:16:34.672376" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:34.673795" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:34.669428" elapsed="0.004775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:34.668801" elapsed="0.005519"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:34.535939" elapsed="0.138481"/>
</kw>
<msg time="2026-04-07T17:16:34.674512" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.674555" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.535297" elapsed="0.139295"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:34.674783" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:34.674669" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.674651" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.675294" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.675647" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.675719" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:34.534619" elapsed="0.141209"/>
</kw>
<msg time="2026-04-07T17:16:34.675922" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.675981" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.529821" elapsed="0.146198"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.676340" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.676096" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.676079" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:34.529684" elapsed="0.146758"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.681936" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.681826" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.681808" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.683216" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:34.683107" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.683088" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:34.683789" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:34.683422" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.684230" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:34.683984" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.720664" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:34.684785" elapsed="0.036041"/>
</kw>
<msg time="2026-04-07T17:16:34.721059" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:34.721106" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.684408" elapsed="0.036735"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.809878" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:34.721698" elapsed="0.088700"/>
</kw>
<msg time="2026-04-07T17:16:34.810803" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:34.810906" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.721310" elapsed="0.089733"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.811841" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.811247" elapsed="0.000798"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.811192" elapsed="0.000914"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.812840" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:34.812403" elapsed="0.000527"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.813230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.813014" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.812994" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:34.813366" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:34.815817" elapsed="0.000543"/>
</kw>
<kw name="Open 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-07T17:16:34.817287" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:34.818693" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:34.814316" elapsed="0.004816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:34.813677" elapsed="0.005570"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:34.682786" elapsed="0.136648"/>
</kw>
<msg time="2026-04-07T17:16:34.819535" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.819580" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.682168" elapsed="0.137449"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:34.819804" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:34.819696" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.819677" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.820357" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.820694" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:34.820772" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:34.681486" elapsed="0.139396"/>
</kw>
<msg time="2026-04-07T17:16:34.820994" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:34.821040" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.676706" elapsed="0.144374"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:34.821468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.821218" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.821199" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:34.676571" elapsed="0.144999"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:34.407866" elapsed="0.413739"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:34.405496" elapsed="0.416173"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:34.400905" elapsed="0.420825"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:34.400479" elapsed="0.421306"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:34.397816" elapsed="0.424027"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:16:34.830258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:34.829997" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:34.829977" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.830629" 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-07T17:16:34.830731" 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-07T17:16:34.830486" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.831315" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2" on remote system "10.30.171.56" 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-07T17:16:34.830908" elapsed="0.000453"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.831885" level="INFO">${conn_id} = 64</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-07T17:16:34.831516" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:34.832826" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:34.832902" 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-07T17:16:34.832524" elapsed="0.000402"/>
</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-07T17:16:34.833093" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:34.834245" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:35.155748" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:34 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:34.833916" elapsed="0.321942"/>
</kw>
<msg time="2026-04-07T17:16:35.155927" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:34.833570" elapsed="0.322441"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:34.832137" elapsed="0.324002"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.156562" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-04-07T17:16:35.209244" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:35.209489" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:35.209591" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': coul...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:35.156344" elapsed="0.053302"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:35.210151" elapsed="0.000901"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.212078" level="INFO">ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': could not open network device vport2 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.211451" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.212620" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.212347" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.212301" elapsed="0.000472"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:35.213152" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.212887" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.212855" elapsed="0.000482"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.213410" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.219225" elapsed="0.000551"/>
</kw>
<kw name="Open 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-07T17:16:35.219936" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:35.220259" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.214109" elapsed="0.006305"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:34.829459" elapsed="0.391045"/>
</kw>
<msg time="2026-04-07T17:16:35.220556" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:34.828890" elapsed="0.391713"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:34.828396" elapsed="0.392285"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.221224" level="INFO">${dictionary_operational} = {'vport1': '2', 'vport2': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vport1=2</arg>
<arg>vport2=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.220863" elapsed="0.000388"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.221732" level="INFO">${dictionary_config} = {'vport1': '0', 'vport2': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vport1=0</arg>
<arg>vport2=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.221427" elapsed="0.000331"/>
</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-07T17:16:35.231400" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:35.231019" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.231887" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:35.231586" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:35.231955" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:16:35.232126" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.230614" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.237434" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.237130" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.237505" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.237648" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.236779" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.243947" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.243700" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.244415" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.244158" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.254447" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.254691" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.254855" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.246495" elapsed="0.008397"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.244571" elapsed="0.010379"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.255224" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.255014" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.244552" elapsed="0.010793"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.259874" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.256763" elapsed="0.003175"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.256464" elapsed="0.003556"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.256438" elapsed="0.003618"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.263399" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.260442" elapsed="0.003022"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.260133" elapsed="0.003389"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.260110" elapsed="0.003455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.264171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.263761" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.264496" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.264267" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.265040" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.264730" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.264576" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.264249" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.265642" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.265273" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.265960" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.265736" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.266511" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.266209" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.266057" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.265718" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.266752" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.267565" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.267268" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.267741" elapsed="0.002144"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.255841" elapsed="0.014105"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.270137" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.270031" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.270012" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.270367" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.270472" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:16:35.272607" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.238016" elapsed="0.034618"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.272685" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:35.272833" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:35.236302" elapsed="0.036556"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.274023" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.273630" elapsed="0.000461"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.273482" elapsed="0.000648"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.274738" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.274356" elapsed="0.000444"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.274212" elapsed="0.000627"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.273353" elapsed="0.001514"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.273093" elapsed="0.001827"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:35.232360" elapsed="0.042594"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.280279" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.279981" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.280351" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.280495" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.279631" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.286684" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.286413" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.287143" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.286876" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.302133" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.302234" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.302324" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.289158" elapsed="0.013192"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.287253" elapsed="0.015138"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.302714" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.302416" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.287235" elapsed="0.015676"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.310232" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.305170" elapsed="0.005165"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.304651" elapsed="0.005758"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.304612" elapsed="0.005852"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.313522" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.311143" elapsed="0.002423"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.310632" elapsed="0.002967"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.310592" elapsed="0.003031"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.314152" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.313774" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.314472" elapsed="0.000063"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.314247" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.315080" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.314757" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.314599" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.314228" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.315676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.315314" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.316013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.315771" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.316546" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.316254" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.316096" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.315753" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.316768" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.317556" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.317282" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.317728" elapsed="0.002279"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.303696" elapsed="0.016374"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.320242" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.320137" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.320119" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.320467" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.320541" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:35.322683" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.280835" elapsed="0.041876"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.322761" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.322909" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:35.279146" elapsed="0.043789"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.324091" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.323711" elapsed="0.000443"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.323566" elapsed="0.000627"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.324777" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.324419" elapsed="0.000420"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.324273" elapsed="0.000604"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.323431" elapsed="0.001474"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.323173" elapsed="0.001783"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:35.275058" elapsed="0.049947"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.330161" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.329850" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.330232" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.330376" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.329514" elapsed="0.000885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.336483" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.336239" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.336911" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.336673" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.349639" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.349780" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.349907" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.338933" elapsed="0.011010"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.337035" elapsed="0.012995"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.350275" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.350067" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.337016" elapsed="0.013377"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.355197" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.351785" elapsed="0.003478"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.351488" elapsed="0.003823"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.351463" elapsed="0.003883"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.358731" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.355723" elapsed="0.003071"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.355424" elapsed="0.003417"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.355400" elapsed="0.003476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.359625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.359113" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.360093" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.359758" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.360831" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.360418" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.360207" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.359732" elapsed="0.001212"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.361670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.361176" elapsed="0.000531"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.362137" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.361802" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.362881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.362478" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.362251" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.361777" elapsed="0.001239"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.363217" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.364300" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.363904" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.364540" elapsed="0.002999"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.350887" elapsed="0.016737"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.367862" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.367718" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.367693" elapsed="0.000359"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.368251" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.368348" elapsed="0.000021"/>
</return>
<msg time="2026-04-07T17:16:35.371356" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.330773" elapsed="0.040621"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.371464" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:16:35.371690" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:16:35.329036" elapsed="0.042684"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.372852" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.372485" elapsed="0.000430"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.372340" elapsed="0.000613"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.373566" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.373198" elapsed="0.000430"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.373050" elapsed="0.000617"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.372211" elapsed="0.001484"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.371938" elapsed="0.001808"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:35.325096" elapsed="0.048683"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:35.232210" elapsed="0.141597"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.230048" elapsed="0.143808"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:16:35.221939" elapsed="0.151967"/>
</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-07T17:16:35.383487" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:35.383112" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.383985" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:35.383671" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:35.384057" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.384209" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.382731" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.389629" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.389330" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.389700" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:35.389846" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.388991" elapsed="0.000879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.396025" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.395751" elapsed="0.000414"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.396566" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.396324" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.405112" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.407027" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.407243" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.398583" elapsed="0.008697"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.396676" elapsed="0.010662"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.407586" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.407375" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.396658" elapsed="0.011045"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.412450" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.409145" elapsed="0.003403"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.408826" elapsed="0.003771"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.408801" elapsed="0.003832"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.415937" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.413082" elapsed="0.002914"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.412753" elapsed="0.003278"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.412727" elapsed="0.003328"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.416594" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.416215" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.416918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.416691" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.417465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.417169" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.417015" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.416673" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.418070" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.417698" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.418403" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.418166" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.418926" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.418638" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.418483" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.418148" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.419170" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.419943" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.419666" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.420134" elapsed="0.002268"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.408240" elapsed="0.014226"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.422637" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.422534" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.422516" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.422863" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.422932" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:35.425178" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.390205" elapsed="0.035001"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.425257" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.425404" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:35.388487" elapsed="0.036943"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.426619" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.426220" elapsed="0.000479"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.426073" elapsed="0.000666"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.427343" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.426979" elapsed="0.000441"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.426819" elapsed="0.000640"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.425926" elapsed="0.001561"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.425657" elapsed="0.001882"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:35.384412" elapsed="0.043196"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.432769" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.432474" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.432840" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.433002" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.432135" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.439126" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.438866" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.439554" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.439317" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.456153" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.456882" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.457176" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.441545" elapsed="0.015688"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.439662" elapsed="0.017663"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.457709" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.457381" elapsed="0.000469"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.439644" elapsed="0.018251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.467391" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.460302" elapsed="0.007193"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.459771" elapsed="0.007760"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.459730" elapsed="0.007826"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.469930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.467829" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.467611" elapsed="0.002413"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.467594" elapsed="0.002454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.470584" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.470202" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.470908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.470681" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.471456" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.471159" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.471005" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.470663" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.472067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.471694" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.472388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.472163" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.472908" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.472619" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.472468" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.472145" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.473150" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.473915" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.473647" elapsed="0.000293"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.474105" elapsed="0.002118"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.458785" elapsed="0.017503"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.476459" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.476356" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.476338" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.476681" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.476749" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:35.479003" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.433355" elapsed="0.045677"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.479083" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.479231" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:35.431642" elapsed="0.047614"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.480390" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.480021" elapsed="0.000446"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.479860" elapsed="0.000646"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.481107" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.480732" elapsed="0.000452"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.480586" elapsed="0.000671"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.479731" elapsed="0.001559"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.479474" elapsed="0.001869"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:35.427698" elapsed="0.053679"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.486520" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.486218" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:35.486591" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:35.486735" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.485869" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.539490" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.539128" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.539951" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.539707" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:35.556990" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:35.557326" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:35.557506" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:35.542022" elapsed="0.015527"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.540100" elapsed="0.017552"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.558097" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.557721" elapsed="0.000564"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.540071" elapsed="0.018264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.565945" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"2e250722-b2f4-4eaf-ad91-9890fc193781","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"b9abcb1c-32d5-4829-8a20-c7462d605340","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2e256b81-3b2c-49f8-8aec-fc295c731cab","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"22:07:25:2e:af:4e","ovsdb:ofport":65534,"ovsdb:ifindex":4},{"tp-id":"vport2","ovsdb:port-uuid":"32963f91-3ca9-4659-b7eb-9ca1e8f1bc25","ovsdb:interface-uuid":"8824b0c4-b87d-468f-a4f6-c4860d2a5595","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"7d9c8227-4ae2-4c2d-bd9c-eb5e78cd3235","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ca99a611-7cc0-4bfb-9d29-fbe11fb5ed55","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"dc22d207-48de-43ac-8a2d-ca693bd822ac","ovsdb:interface-uuid":"5c5a5d38-bed3-4f5b-9290-01bb94786f73","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:22:07:25:2e:af:4e"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.560730" elapsed="0.005550"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.560250" elapsed="0.006111"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.560208" elapsed="0.006210"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.569078" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.566983" elapsed="0.002140"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.566544" elapsed="0.002613"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.566505" elapsed="0.002676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.569761" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.569351" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.570103" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.569856" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.570654" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.570355" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.570198" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.569838" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.571280" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.570885" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.571597" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.571374" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.572131" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:35.571827" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:35.571677" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.571356" elapsed="0.000857"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.572361" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:35.573178" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:35.572862" elapsed="0.000341"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.573352" elapsed="0.002107"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:35.559257" elapsed="0.016267"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:35.575705" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.575598" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.575580" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.575941" elapsed="0.000042"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.576034" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:35.578278" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:35.487093" elapsed="0.091213"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:35.578357" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:35.578507" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:35.485395" elapsed="0.093137"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.579716" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.579335" elapsed="0.000462"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:16:35.579185" elapsed="0.000651"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.580461" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:35.580080" elapsed="0.000460"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:16:35.579919" elapsed="0.000705"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:35.579041" elapsed="0.001615"/>
</for>
<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="PASS" start="2026-04-07T17:16:35.578759" elapsed="0.001973"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:35.481463" elapsed="0.099305"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:35.384282" elapsed="0.196514"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.382148" elapsed="0.198696"/>
</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_operational}</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-07T17:16:35.374105" elapsed="0.206793"/>
</kw>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:16:34.826267" elapsed="0.754733"/>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:16:34.396926" elapsed="1.184207"/>
</test>
<test id="s1-s1-s1-t8" name="Delete the Bridge Manually and Verify Before Fail" 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-07T17:16:35.584580" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:35.584324" 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-07T17:16:35.585817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.585709" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.585691" 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-07T17:16:35.590432" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.590327" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.590309" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.591474" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:35.591097" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.591951" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:35.591652" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:35.592036" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:35.592188" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.590716" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.597221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.597116" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.597088" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.598540" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.598434" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.598415" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:35.599118" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.598744" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.599547" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:35.599297" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.634431" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:35.600119" elapsed="0.034491"/>
</kw>
<msg time="2026-04-07T17:16:35.634794" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:35.634840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.599725" elapsed="0.035151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.705439" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:35.635628" elapsed="0.070066"/>
</kw>
<msg time="2026-04-07T17:16:35.705864" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:35.705909" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.635073" elapsed="0.070887"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.706315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.706085" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.706061" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.706927" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.706556" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.707310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.707101" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.707083" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:35.707442" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.709811" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:16:35.711267" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:35.712670" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.708322" elapsed="0.004770"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:35.707726" elapsed="0.005479"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:35.598127" elapsed="0.115177"/>
</kw>
<msg time="2026-04-07T17:16:35.713393" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.713437" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.597432" elapsed="0.116041"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:35.713654" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.713549" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.713531" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.714172" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.714498" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.714570" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:35.596757" elapsed="0.117920"/>
</kw>
<msg time="2026-04-07T17:16:35.714770" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.714814" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.592560" elapsed="0.122290"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.715182" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.714924" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.714907" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:35.592425" elapsed="0.122857"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.720504" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.720399" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.720381" elapsed="0.000189"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.721806" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.721698" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.721681" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:35.722449" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.722092" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.722871" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:35.722628" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.762215" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:35.723443" elapsed="0.038947"/>
</kw>
<msg time="2026-04-07T17:16:35.762559" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:35.762605" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.723068" elapsed="0.039573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.839204" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:35.763219" elapsed="0.076281"/>
</kw>
<msg time="2026-04-07T17:16:35.839710" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:35.839758" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.762807" elapsed="0.076989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.840175" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.839893" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.839865" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.840820" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.840424" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.841199" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.840987" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.840954" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:35.841331" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.843857" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.845311" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:35.846712" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.842412" elapsed="0.004703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:35.841613" elapsed="0.005616"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:35.721399" elapsed="0.125929"/>
</kw>
<msg time="2026-04-07T17:16:35.847418" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.847461" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.720754" elapsed="0.126743"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:35.847678" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.847573" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.847555" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.848222" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.848543" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.848613" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:35.720063" elapsed="0.128655"/>
</kw>
<msg time="2026-04-07T17:16:35.848807" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.848849" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.715544" elapsed="0.133341"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.849214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.848958" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.848941" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:35.715409" elapsed="0.133906"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.854378" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.854271" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.854253" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.855620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:35.855511" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.855493" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:35.856195" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:35.855824" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.856615" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:35.856373" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.893349" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:35.857184" elapsed="0.036333"/>
</kw>
<msg time="2026-04-07T17:16:35.893724" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:35.893770" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.856793" elapsed="0.037012"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.967684" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:35.894370" elapsed="0.073539"/>
</kw>
<msg time="2026-04-07T17:16:35.968108" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:35.968154" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.893985" elapsed="0.074205"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.968521" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.968280" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.968255" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.969179" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:35.968761" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.969549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.969331" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.969313" elapsed="0.000389"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:35.969736" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.972096" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:16:35.973559" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:35.974961" elapsed="0.000512"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:35.970623" elapsed="0.004921"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:35.970026" elapsed="0.005628"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:35.855213" elapsed="0.120541"/>
</kw>
<msg time="2026-04-07T17:16:35.975843" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.975886" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.854589" elapsed="0.121333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:35.976127" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:35.976020" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.976000" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.976591" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.976914" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:35.977014" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:35.853910" elapsed="0.123211"/>
</kw>
<msg time="2026-04-07T17:16:35.977213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:35.977255" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.849572" elapsed="0.127719"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:35.977645" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.977364" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.977347" elapsed="0.000378"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:35.849436" elapsed="0.128313"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:35.592262" elapsed="0.385519"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:35.589925" elapsed="0.387914"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:35.585424" elapsed="0.392472"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:35.585000" elapsed="0.392942"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:35.582157" elapsed="0.395984"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:16:35.986053" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:35.985776" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:35.985758" elapsed="0.000377"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.986433" 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-07T17:16:35.986535" 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-07T17:16:35.986286" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.987135" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:16:35.986743" elapsed="0.000437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.987698" level="INFO">${conn_id} = 69</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-07T17:16:35.987330" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:35.988627" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:35.988702" 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-07T17:16:35.988342" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.988878" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:35.990073" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:36.362384" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:35 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:35.989742" elapsed="0.372833"/>
</kw>
<msg time="2026-04-07T17:16:36.362673" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.989372" elapsed="0.373389"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:35.987939" elapsed="0.374948"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.363442" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:16:36.456548" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:16:36.456808" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:36.456929" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:36.363171" elapsed="0.093851"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:36.457405" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.458947" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.458332" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.459540" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.459249" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.459199" elapsed="0.000497"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:36.460081" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.459817" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.459784" elapsed="0.000486"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.460344" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.465998" elapsed="0.000332"/>
</kw>
<kw name="Open 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-07T17:16:36.466490" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:36.466796" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.461073" elapsed="0.005869"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:35.985240" elapsed="0.481808"/>
</kw>
<msg time="2026-04-07T17:16:36.467104" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:35.984661" elapsed="0.482494"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:35.984162" elapsed="0.483148"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.467810" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.467491" elapsed="0.000345"/>
</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-07T17:16:36.473754" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:36.473377" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.474254" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:36.473934" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:36.474323" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:36.474474" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:36.473009" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.479763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.479468" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:36.479833" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:36.479992" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.479129" elapsed="0.000889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.486353" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.486107" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.486813" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.486562" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:36.495641" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:36.496656" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:36.496769" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:36.488855" elapsed="0.007940"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.486934" elapsed="0.009922"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.497050" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.496883" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.486904" elapsed="0.010232"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.500379" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.498142" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.497908" elapsed="0.002596"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.497890" elapsed="0.002639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.503456" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.500806" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.500584" elapsed="0.002982"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.500567" elapsed="0.003033"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.504370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.503821" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.504860" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.504504" elapsed="0.000437"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.505625" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.505211" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.504993" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.504479" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.506491" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.505953" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.506939" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.506623" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.507695" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.507288" elapsed="0.000443"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.507075" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.506598" elapsed="0.001212"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.508032" elapsed="0.000472"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:36.509157" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.508724" elapsed="0.000469"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.509401" elapsed="0.002957"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:36.497490" elapsed="0.014955"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:36.512685" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.512541" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.512516" elapsed="0.000320"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.513059" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.513157" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:16:36.515486" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:36.480348" elapsed="0.035166"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:36.515563" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:36.515709" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:36.478629" elapsed="0.037106"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.516902" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:36.516509" elapsed="0.000488"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:36.516360" elapsed="0.000678"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:36.516231" elapsed="0.000839"/>
</for>
<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="PASS" start="2026-04-07T17:16:36.515957" elapsed="0.001166"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:36.474701" elapsed="0.042487"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.522495" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.522199" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:36.522566" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:36.522710" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.521847" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.528817" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.528563" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.529265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.529025" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:36.544467" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:36.544675" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:36.544836" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:36.531243" elapsed="0.013630"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.529374" elapsed="0.015557"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.545202" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.544993" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.529355" elapsed="0.015965"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.549858" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.546700" elapsed="0.003236"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.546402" elapsed="0.003599"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.546377" elapsed="0.003660"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.553340" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.550409" elapsed="0.002993"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.550113" elapsed="0.003335"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.550090" elapsed="0.003391"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.554222" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.553693" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.554669" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.554354" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.555482" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.555069" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.554833" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.554329" elapsed="0.001268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.556320" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.555805" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.556784" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.556452" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.557545" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.557139" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.556905" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.556426" elapsed="0.001233"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.557858" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:36.558948" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.558574" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.559214" elapsed="0.002987"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:36.545789" elapsed="0.016474"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:36.562434" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.562331" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.562313" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.562658" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.562726" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:36.564929" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:36.523074" elapsed="0.041882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:36.565026" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:36.565175" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:36.521355" elapsed="0.043845"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.566352" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:36.565952" elapsed="0.000468"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:36.565800" elapsed="0.000660"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:36.565673" elapsed="0.000815"/>
</for>
<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="PASS" start="2026-04-07T17:16:36.565417" elapsed="0.001121"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:36.517278" elapsed="0.049294"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.571736" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.571443" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:36.571808" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:36.571951" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.571106" elapsed="0.000886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.578179" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.577922" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.578648" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.578408" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:36.593474" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:36.593623" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:16:36.593750" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:36.580647" elapsed="0.013164"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.578758" elapsed="0.015147"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.594341" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.593962" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.578739" elapsed="0.015794"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.602240" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.596790" elapsed="0.005578"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.596287" elapsed="0.006159"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.596246" elapsed="0.006255"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.606705" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.603145" elapsed="0.003605"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.602626" elapsed="0.004158"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.602588" elapsed="0.004221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.607344" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.606976" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.607665" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.607439" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.608215" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.607902" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.607745" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.607421" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.608816" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.608447" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.609196" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.608913" elapsed="0.000341"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.609723" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:36.609429" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:36.609278" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.608894" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.609947" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:36.610730" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:36.610462" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.610903" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:36.595325" elapsed="0.017776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:16:36.613274" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.613170" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.613152" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.613495" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.613566" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:16:36.615735" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:36.572309" elapsed="0.043454"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:36.615813" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:36.615960" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:16:36.570616" elapsed="0.045384"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.617167" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:16:36.616778" elapsed="0.000457"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:16:36.616608" elapsed="0.000666"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:16:36.616478" elapsed="0.000824"/>
</for>
<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="PASS" start="2026-04-07T17:16:36.616220" elapsed="0.001134"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:36.566658" elapsed="0.050729"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:36.474555" elapsed="0.142858"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:16:36.472422" elapsed="0.145039"/>
</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-07T17:16:36.468029" elapsed="0.149484"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:16:35.982137" elapsed="0.635439"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:16:35.581487" elapsed="1.036218"/>
</test>
<test id="s1-s1-s1-t9" name="Create Bridge In Owner and Verify Before Fail" 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-07T17:16:36.621024" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:36.620748" 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-07T17:16:36.622259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.622149" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.622130" 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-07T17:16:36.627019" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.626898" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.626880" elapsed="0.000242"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.628105" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:36.627711" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.628586" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:36.628284" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:36.628681" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:36.628838" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:36.627341" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.633885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.633777" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.633758" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.635204" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.635098" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.635080" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:36.635763" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.635409" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.636202" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:36.635942" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.670873" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:36.636779" elapsed="0.034328"/>
</kw>
<msg time="2026-04-07T17:16:36.671309" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:36.671356" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.636381" elapsed="0.035011"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.761952" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:36.672022" elapsed="0.090144"/>
</kw>
<msg time="2026-04-07T17:16:36.762341" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:36.762387" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.671587" elapsed="0.090836"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.762753" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.762510" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.762486" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.763399" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.763016" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.763769" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.763553" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.763535" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:36.763903" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.766315" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.767845" elapsed="0.000695"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:36.769473" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.764806" elapsed="0.005064"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:36.764204" elapsed="0.005793"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:36.634770" elapsed="0.135329"/>
</kw>
<msg time="2026-04-07T17:16:36.770191" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:36.770234" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.634114" elapsed="0.136156"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:36.770452" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.770347" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.770329" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.770926" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.771272" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.771343" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:36.633446" elapsed="0.138003"/>
</kw>
<msg time="2026-04-07T17:16:36.771541" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:36.771584" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.629228" elapsed="0.142392"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.771936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.771694" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.771677" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:36.629092" elapsed="0.142978"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.777303" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.777195" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.777175" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.778546" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.778439" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.778420" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:36.779129" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.778751" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.779549" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:36.779307" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.817700" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:36.780190" elapsed="0.037668"/>
</kw>
<msg time="2026-04-07T17:16:36.818044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:36.818092" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.779726" elapsed="0.038402"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.896628" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:36.818677" elapsed="0.078210"/>
</kw>
<msg time="2026-04-07T17:16:36.897095" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:36.897141" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.818292" elapsed="0.078886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.897503" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.897263" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.897240" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:36.898149" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:36.897742" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.898513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.898302" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.898284" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:36.898644" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:36.901029" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:16:36.902477" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:36.903877" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:36.899525" elapsed="0.004979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:36.898922" elapsed="0.005782"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:36.778142" elapsed="0.126693"/>
</kw>
<msg time="2026-04-07T17:16:36.904937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:36.905001" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.777517" elapsed="0.127527"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:36.905245" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:36.905138" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.905111" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.905728" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.908187" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.908269" elapsed="0.000026"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:36.776678" elapsed="0.131713"/>
</kw>
<msg time="2026-04-07T17:16:36.908482" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:36.908525" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.772335" elapsed="0.136227"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:36.908881" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:36.908637" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.908620" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:36.772197" elapsed="0.136799"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.914285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.914178" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.914159" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:36.915569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:36.915462" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:36.915444" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:36.916149" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:36.915773" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.916589" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:36.916344" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:36.958170" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:36.917159" elapsed="0.041278"/>
</kw>
<msg time="2026-04-07T17:16:36.958684" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:36.958751" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.916767" elapsed="0.042037"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.026730" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:36.959645" elapsed="0.067276"/>
</kw>
<msg time="2026-04-07T17:16:37.027115" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.027160" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.959077" elapsed="0.068119"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.027487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.027273" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.027253" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.028149" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.027736" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.028513" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.028304" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.028286" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.028644" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.030925" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:16:37.032393" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.033772" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.029485" elapsed="0.004693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.028897" elapsed="0.005393"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:36.915164" elapsed="0.119225"/>
</kw>
<msg time="2026-04-07T17:16:37.034480" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.034523" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.914531" elapsed="0.120029"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.034739" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.034635" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.034616" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.035249" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.035571" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.035641" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:36.913738" elapsed="0.122009"/>
</kw>
<msg time="2026-04-07T17:16:37.035837" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.035880" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.909260" elapsed="0.126656"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.036273" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.036020" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.036002" elapsed="0.000348"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:36.909124" elapsed="0.127249"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:36.628913" elapsed="0.407488"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:36.626534" elapsed="0.409924"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:36.621848" elapsed="0.414664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:36.621432" elapsed="0.415125"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:36.618772" elapsed="0.417836"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:37.048347" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.044654" elapsed="0.003736">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:36.618165" elapsed="0.430386">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t10" name="Create Port In Owner and Verify Before Fail" 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-07T17:16:37.051708" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:37.051453" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.052978" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.052856" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.052838" 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-07T17:16:37.057542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.057438" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.057420" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.058590" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:37.058213" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.059091" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:37.058770" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:37.059161" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:37.059311" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:37.057823" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.064513" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.064407" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.064388" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.065790" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.065644" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.065626" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.066379" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.066021" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.066798" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.066557" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.106404" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.067374" elapsed="0.039202"/>
</kw>
<msg time="2026-04-07T17:16:37.106757" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.106803" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.066994" elapsed="0.039845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.176293" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.107443" elapsed="0.069060"/>
</kw>
<msg time="2026-04-07T17:16:37.176669" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.176714" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.107041" elapsed="0.069709"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.177093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.176836" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.176813" elapsed="0.000382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.177708" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.177335" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.178092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.177862" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.177844" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.178227" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.180594" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:16:37.182026" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.183420" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.179121" elapsed="0.004689"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.178516" elapsed="0.005412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.065347" elapsed="0.118723"/>
</kw>
<msg time="2026-04-07T17:16:37.184163" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.184208" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.064725" elapsed="0.119521"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.184427" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.184322" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.184303" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.184904" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.185300" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.185370" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.064048" elapsed="0.121430"/>
</kw>
<msg time="2026-04-07T17:16:37.185572" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.185615" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.059695" elapsed="0.125956"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.185980" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.185725" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.185709" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:37.059559" elapsed="0.126523"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.191506" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.191399" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.191381" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.192763" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.192657" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.192639" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.193344" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.192988" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.193765" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.193522" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.237745" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.194334" elapsed="0.043576"/>
</kw>
<msg time="2026-04-07T17:16:37.238106" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.238152" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.193942" elapsed="0.044246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.343272" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.238754" elapsed="0.104727"/>
</kw>
<msg time="2026-04-07T17:16:37.343659" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.343705" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.238359" elapsed="0.105407"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.344128" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.343855" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.343832" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.344758" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.344374" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.345138" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.344910" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.344893" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.345270" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.347671" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.349145" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.350543" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.346207" elapsed="0.004729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.345595" elapsed="0.005480"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.192359" elapsed="0.158817"/>
</kw>
<msg time="2026-04-07T17:16:37.351269" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.351312" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.191717" elapsed="0.159631"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.351530" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.351424" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.351406" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.352097" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.352434" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.352503" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.190845" elapsed="0.161765"/>
</kw>
<msg time="2026-04-07T17:16:37.352703" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.352747" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.186342" elapsed="0.166441"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.353116" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.352858" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.352841" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:37.186207" elapsed="0.167009"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.358546" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.358438" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.358420" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.359804" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.359682" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.359665" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.360380" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.360023" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.360803" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.360559" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.395462" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.361376" elapsed="0.034262"/>
</kw>
<msg time="2026-04-07T17:16:37.395821" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.395867" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.360995" elapsed="0.034908"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.485797" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.396466" elapsed="0.089788"/>
</kw>
<msg time="2026-04-07T17:16:37.486528" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.486578" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.396083" elapsed="0.090534"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.487185" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.486762" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.486712" elapsed="0.000593"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.488024" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.487453" elapsed="0.000663"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.488398" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.488184" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.488165" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.488535" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.491178" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.492693" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.494167" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.489584" elapsed="0.004988"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.488900" elapsed="0.005786"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.359385" elapsed="0.135401"/>
</kw>
<msg time="2026-04-07T17:16:37.494882" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.494927" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.358760" elapsed="0.136204"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.495182" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.495072" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.495053" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.495699" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.496140" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.496212" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.358098" elapsed="0.138225"/>
</kw>
<msg time="2026-04-07T17:16:37.496420" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.496464" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.353480" elapsed="0.143022"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.496829" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.496580" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.496563" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:37.353344" elapsed="0.143586"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:37.059390" elapsed="0.437593"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:37.057085" elapsed="0.439966"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:37.052574" elapsed="0.444576"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.052161" elapsed="0.445048"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:37.049497" elapsed="0.447770"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:37.509141" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.505439" elapsed="0.003741">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.048907" elapsed="0.460443">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t11" name="Modify the destination IP of Port In Owner Before Fail" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:37.513087" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:37.512714" elapsed="0.000656"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.514373" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.514260" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.514242" 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-07T17:16:37.519019" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.518890" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.518873" elapsed="0.000216"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.520094" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:37.519693" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.520578" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:37.520276" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:37.520646" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:37.520797" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:37.519309" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.526043" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.525919" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.525901" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.527291" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.527186" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.527168" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.527872" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.527495" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.528322" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.528072" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.567685" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.528876" elapsed="0.038980"/>
</kw>
<msg time="2026-04-07T17:16:37.568107" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.568154" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.528501" elapsed="0.039689"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.659074" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.568743" elapsed="0.090532"/>
</kw>
<msg time="2026-04-07T17:16:37.659472" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.659561" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.568355" elapsed="0.091244"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.659896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.659677" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.659657" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.660532" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.660162" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.660897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.660687" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.660669" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.661045" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.663337" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:16:37.664797" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.666249" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.661871" elapsed="0.004769"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.661302" elapsed="0.005451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.526863" elapsed="0.139987"/>
</kw>
<msg time="2026-04-07T17:16:37.666941" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.666999" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.526255" elapsed="0.140781"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.667219" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.667113" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.667094" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.667714" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.668071" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.668142" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.525586" elapsed="0.142662"/>
</kw>
<msg time="2026-04-07T17:16:37.668339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.668382" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.521214" elapsed="0.147204"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.668733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.668490" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.668474" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:37.521074" elapsed="0.147757"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.674277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.674170" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.674152" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.675585" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.675447" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.675429" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.676167" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.675793" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.676585" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.676344" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.722022" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.677160" elapsed="0.045038"/>
</kw>
<msg time="2026-04-07T17:16:37.722366" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.722411" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.676764" elapsed="0.045683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.809671" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.723012" elapsed="0.086993"/>
</kw>
<msg time="2026-04-07T17:16:37.810251" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.810299" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.722611" elapsed="0.087725"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.810801" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.810463" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.810420" elapsed="0.000493"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.811588" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.811088" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.811998" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.811753" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.811734" elapsed="0.000367"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.812139" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.814660" elapsed="0.000552"/>
</kw>
<kw name="Open 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-07T17:16:37.816171" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.817585" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.813138" elapsed="0.004856"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.812469" elapsed="0.005641"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.675127" elapsed="0.143084"/>
</kw>
<msg time="2026-04-07T17:16:37.818308" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.818354" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.674490" elapsed="0.143901"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.818578" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.818470" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.818451" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.819095" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.819528" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.819599" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.673816" elapsed="0.145893"/>
</kw>
<msg time="2026-04-07T17:16:37.819809" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.819854" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.669204" elapsed="0.150687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.820239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.819986" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.819952" elapsed="0.000364"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:37.668950" elapsed="0.151390"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.825853" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.825745" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.825727" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.827247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.827124" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.827104" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.827810" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.827454" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.828252" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.828006" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.865311" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.828812" elapsed="0.036673"/>
</kw>
<msg time="2026-04-07T17:16:37.865651" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:37.865697" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.828431" elapsed="0.037303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.940644" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:37.866313" elapsed="0.074544"/>
</kw>
<msg time="2026-04-07T17:16:37.941050" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:37.941097" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.865900" elapsed="0.075233"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.941463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.941220" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.941196" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.942104" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:37.941703" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.942473" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.942263" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.942245" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:37.942608" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:37.945029" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.946458" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:37.947880" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:37.943568" elapsed="0.004724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:37.942945" elapsed="0.005457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.826692" elapsed="0.121810"/>
</kw>
<msg time="2026-04-07T17:16:37.948593" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.948636" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.826090" elapsed="0.122583"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:37.948856" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:37.948750" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.948731" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.949344" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.949682" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.949751" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.825402" elapsed="0.124463"/>
</kw>
<msg time="2026-04-07T17:16:37.949959" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:37.950031" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.820618" elapsed="0.129450"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:37.950388" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:37.950145" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.950128" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:37.820479" elapsed="0.130009"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:37.520877" elapsed="0.429645"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:37.518531" elapsed="0.432055"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:37.513954" elapsed="0.436696"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.513519" elapsed="0.437180"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:37.510501" elapsed="0.440256"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:37.959095" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.955265" elapsed="0.003873">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.509860" elapsed="0.449452">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t12" name="Verify Port Is Modified Before Fail" 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-07T17:16:37.962308" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:37.962052" 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-07T17:16:37.963543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.963435" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.963417" 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-07T17:16:37.968277" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.968133" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.968115" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.969333" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:37.968937" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:37.969817" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:37.969514" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:37.969885" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:37.970054" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:37.968568" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.975253" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.975147" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.975129" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:37.976504" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:37.976398" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:37.976381" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:37.977090" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:37.976712" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:37.977516" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:37.977270" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.013881" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:37.978094" elapsed="0.035970"/>
</kw>
<msg time="2026-04-07T17:16:38.014233" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:38.014278" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.977695" elapsed="0.036619"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.088861" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:38.014863" elapsed="0.074230"/>
</kw>
<msg time="2026-04-07T17:16:38.089262" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:38.089308" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.014478" elapsed="0.074865"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.089639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.089422" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.089402" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.090265" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:38.089875" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.090621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.090412" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.090394" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:38.090750" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:38.093068" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:38.094556" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:38.095960" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:38.091605" elapsed="0.004763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:38.091032" elapsed="0.005449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:37.976100" elapsed="0.120481"/>
</kw>
<msg time="2026-04-07T17:16:38.096672" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.096715" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.975465" elapsed="0.121286"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:38.096933" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:38.096827" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.096809" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.097418" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.097747" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.097817" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:37.974786" elapsed="0.123136"/>
</kw>
<msg time="2026-04-07T17:16:38.098047" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.098092" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.970450" elapsed="0.127678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.098448" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.098203" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.098186" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:37.970312" elapsed="0.128234"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.103853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:38.103747" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.103729" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.105139" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:38.105031" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.105013" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:38.105691" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:38.105341" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.106223" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:38.105869" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.143324" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:38.106781" elapsed="0.036922"/>
</kw>
<msg time="2026-04-07T17:16:38.144122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:38.144226" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.106403" elapsed="0.037904"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.209648" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:38.145603" elapsed="0.064290"/>
</kw>
<msg time="2026-04-07T17:16:38.210084" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:38.210131" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.144689" elapsed="0.065478"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.210490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.210258" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.210232" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.211154" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:38.210749" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.211515" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.211304" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.211286" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:38.211648" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:38.214013" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:38.215463" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:38.216854" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:38.212536" elapsed="0.004732"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:38.211929" elapsed="0.005451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:38.104713" elapsed="0.112769"/>
</kw>
<msg time="2026-04-07T17:16:38.217574" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.217617" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.104103" elapsed="0.113551"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:38.217838" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:38.217732" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.217713" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.218324" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.218651" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.218744" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:38.103412" elapsed="0.115443"/>
</kw>
<msg time="2026-04-07T17:16:38.218948" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.219023" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.098802" elapsed="0.120259"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.219383" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.219139" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.219121" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:38.098669" elapsed="0.120816"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.226621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:38.226514" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.226495" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.227917" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:38.227810" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.227793" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:38.228506" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:38.228153" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.228926" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:38.228685" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.263569" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:38.229503" elapsed="0.034222"/>
</kw>
<msg time="2026-04-07T17:16:38.263913" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:38.263958" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.229123" elapsed="0.034909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:38.321246" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:38.264586" elapsed="0.056854"/>
</kw>
<msg time="2026-04-07T17:16:38.321610" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:38.321655" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.264200" elapsed="0.057491"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.322016" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.321768" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.321748" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.322642" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:38.322260" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.323035" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.322791" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.322773" elapsed="0.000363"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:38.323169" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:38.325626" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:16:38.327132" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:38.328568" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:38.324125" elapsed="0.004854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:38.323420" elapsed="0.005678"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:38.227514" elapsed="0.101683"/>
</kw>
<msg time="2026-04-07T17:16:38.329290" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.329333" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.226883" elapsed="0.102486"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:38.329552" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:38.329446" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.329427" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.330047" elapsed="0.000070"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.330423" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.330495" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:38.226176" elapsed="0.104442"/>
</kw>
<msg time="2026-04-07T17:16:38.330712" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:38.330755" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:38.219747" elapsed="0.111045"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.331129" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.330868" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:38.330851" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:38.219613" elapsed="0.111617"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:37.970136" elapsed="0.361128"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:37.967758" elapsed="0.363565"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:37.963149" elapsed="0.368233"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:37.962710" elapsed="0.368717"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:37.960082" elapsed="0.371400"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.338141" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:38.337766" elapsed="0.000402"/>
</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-07T17:16:38.348150" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:38.347734" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.348656" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:38.348356" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:38.348726" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:38.348877" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:38.347368" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.354164" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:38.353853" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:38.354235" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:38.354378" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:38.353514" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.360501" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:38.360256" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:38.360931" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:38.360693" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:38.377457" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:38.377794" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:38.377925" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:38.363098" elapsed="0.016446">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:38.361057" elapsed="0.018672">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.380161" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:38.379799" elapsed="0.000508"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:38.361039" elapsed="0.019321">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.381191" elapsed="0.000054"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.381479" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:38.381399" elapsed="0.000170"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:38.381363" elapsed="0.000254"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:38.381918" elapsed="0.000071"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.382102" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:38.354740" elapsed="0.027593">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:38.382466" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-04-07T17:16:38.353031" elapsed="0.029660">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:38.383220" elapsed="0.000053"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:38.349117" elapsed="0.034273">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:38.348956" elapsed="0.034561">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:38.346705" elapsed="0.037007">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:16:39.399354" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:39.398879" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:39.399861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:39.399551" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:39.399932" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:39.400121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:39.398498" elapsed="0.001647"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:39.405538" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:39.405191" elapsed="0.000380"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:39.405618" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:39.405768" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:39.404826" elapsed="0.000967"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:39.412212" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:39.411940" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:39.412652" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:39.412410" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:39.422843" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:39.422999" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:39.423105" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:39.414678" elapsed="0.008797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:39.412767" elapsed="0.010791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:39.423743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:39.423592" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:39.412747" elapsed="0.011084">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:39.424210" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:39.424342" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:39.424307" elapsed="0.000075"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:39.424289" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:39.424541" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:39.424607" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:39.406153" elapsed="0.018556">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:39.424768" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:16:39.404342" elapsed="0.020517">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:39.425099" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:39.400407" elapsed="0.024768">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:39.400258" elapsed="0.025036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:39.397736" elapsed="0.027657">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:16:40.444595" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:40.444096" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:40.445132" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:40.444797" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:40.445207" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:16:40.445384" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:40.443692" elapsed="0.001717"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:40.450659" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:40.450363" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:40.450731" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:40.450874" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:40.450025" elapsed="0.000873"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:40.457294" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:40.457038" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:40.457733" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:40.457491" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:40.467820" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:40.467983" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:40.468093" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:40.459747" elapsed="0.008749">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:40.457848" elapsed="0.010733">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:40.468768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:40.468616" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:40.457827" elapsed="0.011031">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:40.469240" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:40.469466" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:40.469428" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:40.469409" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:40.469673" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:40.469743" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:40.451257" elapsed="0.018590">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:40.469909" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:16:40.449532" elapsed="0.020486">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:40.470249" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:40.445619" elapsed="0.024707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:40.445468" elapsed="0.024916">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:40.442853" elapsed="0.027625">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:16:41.487678" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:41.487063" elapsed="0.000665"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:41.488435" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:41.488005" elapsed="0.000467"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:41.488537" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:16:41.488762" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:41.486463" elapsed="0.002334"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:41.495175" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:41.494860" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:41.495247" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:41.495393" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:41.494522" elapsed="0.000895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:41.501765" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:41.501513" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:41.502220" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:41.501961" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:41.512585" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:41.512800" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:41.513152" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:41.504256" elapsed="0.009650">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:41.502335" elapsed="0.011779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:41.514527" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:41.514188" elapsed="0.000484"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:41.502315" elapsed="0.012410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:41.515585" elapsed="0.000058"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:41.515886" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:41.515803" elapsed="0.000206"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:41.515765" elapsed="0.000296"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:41.516371" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:41.516525" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:41.495759" elapsed="0.020993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:41.516888" elapsed="0.000034"/>
</return>
<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="FAIL" start="2026-04-07T17:16:41.494043" elapsed="0.023084">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:41.517638" elapsed="0.000055"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:41.489087" elapsed="0.028722">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:41.488873" elapsed="0.029065">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:41.485456" elapsed="0.032718">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:16:42.533559" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:42.532955" elapsed="0.000638"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:42.534099" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:42.533763" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:42.534173" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:16:42.534347" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:42.532564" elapsed="0.001808"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:42.539653" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:42.539356" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:42.539803" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:42.539950" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:42.539015" elapsed="0.000975"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:42.546324" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:42.546059" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:42.546761" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:42.546519" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:42.557014" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:42.557209" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:42.557350" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:42.548779" elapsed="0.009071">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:42.546878" elapsed="0.011111">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:42.558250" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:42.558038" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:42.546857" elapsed="0.011517">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:42.558873" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:42.559101" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:42.559047" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:42.559021" elapsed="0.000171"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:42.559387" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:42.559484" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:42.540329" elapsed="0.019299">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:42.559714" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:16:42.538512" elapsed="0.021333">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:42.560187" elapsed="0.000035"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:42.534574" elapsed="0.025723">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:42.534431" elapsed="0.025947">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:42.531658" elapsed="0.028894">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:16:43.575803" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:43.575349" elapsed="0.000484"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.576344" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:43.576009" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:43.576419" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:43.576588" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:43.574944" elapsed="0.001669"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.581922" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:43.581599" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:43.581994" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:16:43.582158" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:43.581260" elapsed="0.000923"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.588510" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:43.588258" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.588944" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:43.588705" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:43.598774" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:43.598911" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:16:43.599036" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.590984" elapsed="0.008820">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:43.589079" elapsed="0.010913">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.600434" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.600096" elapsed="0.000480"/>
</branch>
<status status="FAIL" start="2026-04-07T17:16:43.589058" elapsed="0.011571">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.601473" elapsed="0.000061"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.601773" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.601692" elapsed="0.000171"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:43.601654" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.602344" elapsed="0.000050"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.602503" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.582516" elapsed="0.020216">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.602891" elapsed="0.000035"/>
</return>
<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="FAIL" start="2026-04-07T17:16:43.580765" elapsed="0.022371">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:16:43.603648" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:16:43.576814" elapsed="0.027006">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:16:43.576670" elapsed="0.027274">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.574170" elapsed="0.030015">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:16:43.604395" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:16:38.338355" elapsed="5.266244">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:38.335787" elapsed="5.269056">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:37.959543" elapsed="5.645660">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s1-t13" name="Delete Port In Owner 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-07T17:16:43.609931" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:43.609673" 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-07T17:16:43.611202" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.611092" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.611073" 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-07T17:16:43.615977" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.615870" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.615852" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.617048" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:43.616651" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.617533" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:43.617231" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:43.617602" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:43.617791" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:43.616283" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.622826" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.622720" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.622701" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.624250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.624129" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.624107" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:43.624825" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:43.624459" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.625281" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:43.625028" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.660146" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:43.625840" elapsed="0.034484"/>
</kw>
<msg time="2026-04-07T17:16:43.660500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:43.660547" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.625461" elapsed="0.035122"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.724685" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:43.661171" elapsed="0.063727"/>
</kw>
<msg time="2026-04-07T17:16:43.725091" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:43.725137" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.660752" elapsed="0.064421"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.725468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.725250" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.725229" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.726098" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:43.725708" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.726455" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.726247" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.726229" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:43.726584" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:43.728877" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:16:43.730361" elapsed="0.000612"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:43.731920" elapsed="0.000481"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:43.727441" elapsed="0.005035"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:43.726851" elapsed="0.005767"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:43.623702" elapsed="0.109019"/>
</kw>
<msg time="2026-04-07T17:16:43.732860" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.732907" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.623057" elapsed="0.109887"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:43.733168" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:43.733053" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.733030" elapsed="0.000271"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.733711" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.734086" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.734168" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:43.622387" elapsed="0.111888"/>
</kw>
<msg time="2026-04-07T17:16:43.734369" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.734413" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.618190" elapsed="0.116260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.734773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.734525" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.734508" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:43.618053" elapsed="0.116821"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.740212" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.740105" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.740087" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.741457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.741351" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.741333" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:43.742118" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:43.741665" elapsed="0.000481"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.742546" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:43.742300" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.778729" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:43.743124" elapsed="0.035908"/>
</kw>
<msg time="2026-04-07T17:16:43.779306" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:43.779354" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.742724" elapsed="0.036667"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.838796" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:43.780251" elapsed="0.058754"/>
</kw>
<msg time="2026-04-07T17:16:43.839200" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:43.839247" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.779687" elapsed="0.059597"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.839651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.839386" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.839355" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.840412" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:43.839980" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.840783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.840569" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.840551" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:43.840921" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:43.843485" elapsed="0.000565"/>
</kw>
<kw name="Open 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-07T17:16:43.844987" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:43.846439" elapsed="0.000558"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:43.841904" elapsed="0.005184"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:43.841282" elapsed="0.005924"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:43.741052" elapsed="0.106254"/>
</kw>
<msg time="2026-04-07T17:16:43.847399" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.847443" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.740422" elapsed="0.107058"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:43.847664" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:43.847558" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.847539" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.848211" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.848551" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.848623" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:43.739748" elapsed="0.108981"/>
</kw>
<msg time="2026-04-07T17:16:43.848824" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.848866" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.735162" elapsed="0.113740"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.849393" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.848983" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.848961" elapsed="0.000511"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:43.735001" elapsed="0.114495"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.854796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.854689" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.854670" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.856087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.855946" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.855928" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:43.856655" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:43.856294" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.857100" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:43.856835" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.891373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:43.857698" elapsed="0.033835"/>
</kw>
<msg time="2026-04-07T17:16:43.891702" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:43.891748" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.857318" elapsed="0.034466"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:43.957779" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:43.892358" elapsed="0.065669"/>
</kw>
<msg time="2026-04-07T17:16:43.958207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:43.958253" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.891948" elapsed="0.066341"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.958596" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.958371" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.958350" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.959266" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:43.958838" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.959625" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.959415" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.959396" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:43.959761" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:43.962098" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:43.963547" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:43.964957" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:43.960630" elapsed="0.004737"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:43.960056" elapsed="0.005424"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:43.855650" elapsed="0.109928"/>
</kw>
<msg time="2026-04-07T17:16:43.965668" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.965712" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.855025" elapsed="0.110723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:43.965928" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:43.965824" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.965805" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.966411" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.966918" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.966996" elapsed="0.000044"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:43.854346" elapsed="0.112791"/>
</kw>
<msg time="2026-04-07T17:16:43.967229" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:43.967272" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.849769" elapsed="0.117572"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:43.967666" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:43.967420" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.967402" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:43.849632" elapsed="0.118135"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:43.617867" elapsed="0.349930"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:43.615503" elapsed="0.352357"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:43.610786" elapsed="0.357136"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.610365" elapsed="0.357610"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:43.607090" elapsed="0.361104"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:43.979675" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.975943" elapsed="0.003771">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.605654" elapsed="0.374230">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t14" name="Delete Bridge In Owner And Verify Before Fail" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:43.983160" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:43.982879" 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-07T17:16:43.984388" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.984279" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.984261" 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-07T17:16:43.988976" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.988865" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.988848" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.990071" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:43.989672" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:43.990562" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:43.990259" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:43.990631" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:43.990781" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:43.989302" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.998403" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.998294" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.998275" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:43.999655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:43.999549" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:43.999531" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.000243" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:43.999859" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.000663" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.000422" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.033850" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.001239" elapsed="0.032898"/>
</kw>
<msg time="2026-04-07T17:16:44.034328" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.034374" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.000841" elapsed="0.033570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.099772" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.035031" elapsed="0.064940"/>
</kw>
<msg time="2026-04-07T17:16:44.100160" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.100205" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.034598" elapsed="0.065644"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.100544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.100321" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.100301" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.101184" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.100782" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.101546" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.101337" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.101319" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.101678" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.104063" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.105506" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.106933" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.102581" elapsed="0.004764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.101983" elapsed="0.005476"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:43.999250" elapsed="0.108306"/>
</kw>
<msg time="2026-04-07T17:16:44.107646" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.107690" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.998617" elapsed="0.109109"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.107908" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.107802" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.107784" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.108404" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.108733" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.108803" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:43.997939" elapsed="0.110969"/>
</kw>
<msg time="2026-04-07T17:16:44.109005" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.109077" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.991190" elapsed="0.117924"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.109475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.109227" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.109207" elapsed="0.000345"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:43.991053" elapsed="0.118522"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.115042" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.114918" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.114899" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.116292" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.116187" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.116169" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.116847" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.116494" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.117289" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.117046" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.167859" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.117842" elapsed="0.050194"/>
</kw>
<msg time="2026-04-07T17:16:44.168204" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.168249" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.117468" elapsed="0.050816"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.243431" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.168836" elapsed="0.074792"/>
</kw>
<msg time="2026-04-07T17:16:44.243798" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.243844" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.168448" elapsed="0.075433"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.244242" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.243960" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.243939" elapsed="0.000406"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.244853" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.244482" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.245235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.245025" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.244991" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.245367" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.247659" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:16:44.249118" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.250502" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.246207" elapsed="0.004682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.245623" elapsed="0.005409"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.115858" elapsed="0.135314"/>
</kw>
<msg time="2026-04-07T17:16:44.251267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.251311" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.115255" elapsed="0.136093"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.251529" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.251424" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.251406" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.251991" elapsed="0.000040"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.252333" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.252403" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.114580" elapsed="0.137957"/>
</kw>
<msg time="2026-04-07T17:16:44.252631" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.252674" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.109832" elapsed="0.142878"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.253043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.252784" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.252767" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:44.109699" elapsed="0.143446"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.258530" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.258424" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.258406" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.259822" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.259718" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.259700" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.260415" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.260057" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.260841" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.260592" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.294833" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.261445" elapsed="0.033739"/>
</kw>
<msg time="2026-04-07T17:16:44.295390" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.295438" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.261064" elapsed="0.034411"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.362207" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.296061" elapsed="0.066346"/>
</kw>
<msg time="2026-04-07T17:16:44.362577" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.362623" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.295644" elapsed="0.067016"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.362999" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.362771" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.362750" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.363632" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.363259" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.364001" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.363786" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.363768" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.364152" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.366450" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:16:44.367866" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.369263" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.364981" elapsed="0.004697"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.364407" elapsed="0.005382"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.259421" elapsed="0.110467"/>
</kw>
<msg time="2026-04-07T17:16:44.369979" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.370040" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.258741" elapsed="0.111338"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.370264" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.370156" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.370138" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.370733" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.371087" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.371158" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.258087" elapsed="0.113183"/>
</kw>
<msg time="2026-04-07T17:16:44.371362" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.371407" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.253404" elapsed="0.118041"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.371763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.371519" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.371502" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:44.253269" elapsed="0.118594"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:43.990862" elapsed="0.381030"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:43.988513" elapsed="0.383435"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:43.983976" elapsed="0.388061"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:43.983562" elapsed="0.388525"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:43.980903" elapsed="0.391237"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:44.383978" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:44.380270" elapsed="0.003761">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:43.980285" elapsed="0.403896">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t15" name="Kill Owner Instance" 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-07T17:16:44.387307" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:44.387049" 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-07T17:16:44.388525" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.388417" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.388399" 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-07T17:16:44.393113" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.392992" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.392975" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.394165" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:44.393769" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.394676" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:44.394344" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:44.394747" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:44.394900" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:44.393401" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.400156" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.400047" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.400027" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.401416" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.401311" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.401293" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.401975" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.401618" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.402421" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.402178" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.436587" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.402978" elapsed="0.033779"/>
</kw>
<msg time="2026-04-07T17:16:44.436931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.436981" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.402599" elapsed="0.034435"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.480864" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.437596" elapsed="0.043497"/>
</kw>
<msg time="2026-04-07T17:16:44.481278" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.481324" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.437204" elapsed="0.044156"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.481680" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.481445" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.481421" elapsed="0.000411"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.482396" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.481980" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.482768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.482558" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.482540" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.482900" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.485292" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.486768" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.488177" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.483800" elapsed="0.004769"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.483215" elapsed="0.005466"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.400989" elapsed="0.087793"/>
</kw>
<msg time="2026-04-07T17:16:44.488877" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.488921" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.400375" elapsed="0.088584"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.489161" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.489054" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.489034" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.489639" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.489972" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.490072" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.399690" elapsed="0.090492"/>
</kw>
<msg time="2026-04-07T17:16:44.490276" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.490319" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.395298" elapsed="0.095057"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.490674" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.490431" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.490414" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:44.395163" elapsed="0.095610"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.496308" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.496201" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.496183" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.497564" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.497460" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.497443" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.498140" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.497768" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.498561" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.498318" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.534289" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.499175" elapsed="0.035289"/>
</kw>
<msg time="2026-04-07T17:16:44.534631" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.534677" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.498773" elapsed="0.035941"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.577916" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.535300" elapsed="0.042842"/>
</kw>
<msg time="2026-04-07T17:16:44.578313" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.578359" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.534880" elapsed="0.043516"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.578721" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.578475" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.578454" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.579350" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.578960" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.579703" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.579495" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.579477" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.579832" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.582150" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:16:44.583601" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.584981" elapsed="0.000392"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.580673" elapsed="0.004775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.580105" elapsed="0.005454"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.497157" elapsed="0.088505"/>
</kw>
<msg time="2026-04-07T17:16:44.585754" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.585797" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.496520" elapsed="0.089314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.586053" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.585910" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.585892" elapsed="0.000247"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.586525" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.586852" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.586922" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.495846" elapsed="0.091329"/>
</kw>
<msg time="2026-04-07T17:16:44.587270" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.587314" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.491185" elapsed="0.096198"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.587708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.587462" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.587444" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:44.490920" elapsed="0.096888"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.593161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.593052" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.593032" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.594414" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.594309" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.594291" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.594967" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.594617" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.595436" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.595164" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.629741" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.595999" elapsed="0.034119"/>
</kw>
<msg time="2026-04-07T17:16:44.630440" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.630491" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.595617" elapsed="0.034913"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.671052" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.631499" elapsed="0.039754"/>
</kw>
<msg time="2026-04-07T17:16:44.671427" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.671473" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.630876" elapsed="0.040634"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.671930" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.671629" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.671593" elapsed="0.000476"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.672616" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.672219" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.672988" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.672772" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.672753" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.673147" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.675802" elapsed="0.000560"/>
</kw>
<kw name="Open 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-07T17:16:44.677410" elapsed="0.000523"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.678894" elapsed="0.000388"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.674199" elapsed="0.005156"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.673533" elapsed="0.005938"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.593985" elapsed="0.085750"/>
</kw>
<msg time="2026-04-07T17:16:44.679839" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.679886" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.593374" elapsed="0.086556"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.680146" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.680033" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.679996" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.680670" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.681040" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.681113" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.592696" elapsed="0.088530"/>
</kw>
<msg time="2026-04-07T17:16:44.681330" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.681377" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.588081" elapsed="0.093334"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.681746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.681497" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.681478" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:44.587928" elapsed="0.093921"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:44.394976" elapsed="0.286913"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:44.392637" elapsed="0.289323"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:44.388135" elapsed="0.293933"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.387709" elapsed="0.294414"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:44.385039" elapsed="0.297149"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:16:44.686685" 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-07T17:16:44.682463" elapsed="0.004262">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_candidate_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.686899" elapsed="0.000023"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-07T17:16:44.384535" elapsed="0.302573">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t16" name="Check Shards Status After Fail" line="85">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:44.691064" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:44.690761" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.692634" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.692520" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.692500" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.701083" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.700737" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.700677" elapsed="0.000605"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.703862" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:44.702840" elapsed="0.001085"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.704731" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:44.704365" elapsed="0.000392"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:44.704942" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:16:44.705147" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:44.701937" elapsed="0.003236"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.710856" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.710744" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.710724" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.712222" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.712113" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.712095" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.712840" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.712461" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.713306" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.713045" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.749777" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.713874" elapsed="0.036277"/>
</kw>
<msg time="2026-04-07T17:16:44.750464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.750514" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.713487" elapsed="0.037064"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.819807" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.751526" elapsed="0.068724"/>
</kw>
<msg time="2026-04-07T17:16:44.820561" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.820609" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.750888" elapsed="0.069758"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.821318" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.820828" elapsed="0.000582"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.820763" elapsed="0.000683"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.822182" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.821601" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.822559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.822345" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.822326" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.822702" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.825495" elapsed="0.000560"/>
</kw>
<kw name="Open 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-07T17:16:44.827065" elapsed="0.000542"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.828556" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.823823" elapsed="0.005162"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.823120" elapsed="0.006008"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.711786" elapsed="0.117548"/>
</kw>
<msg time="2026-04-07T17:16:44.829443" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.829494" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.711091" elapsed="0.118464"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.829756" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.829642" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.829621" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.830297" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.830655" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.830727" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.710390" elapsed="0.120453"/>
</kw>
<msg time="2026-04-07T17:16:44.830950" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.831000" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.705612" elapsed="0.125442"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.831390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.831136" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.831118" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:44.705462" elapsed="0.126031"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.837317" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.837206" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.837185" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.838621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.838512" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.838494" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.839225" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.838827" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.839658" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.839409" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.874708" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.840242" elapsed="0.034632"/>
</kw>
<msg time="2026-04-07T17:16:44.875067" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.875115" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.839837" elapsed="0.035315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.929916" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.875750" elapsed="0.054551"/>
</kw>
<msg time="2026-04-07T17:16:44.930588" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:44.930637" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.875325" elapsed="0.055350"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.931243" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.930827" elapsed="0.000597"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.930777" elapsed="0.000682"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:44.932168" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:44.931607" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.932537" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.932323" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.932304" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:44.932676" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:44.935356" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:16:44.936855" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:44.938347" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:44.933746" elapsed="0.005006"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:44.933067" elapsed="0.005800"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.838213" elapsed="0.100761"/>
</kw>
<msg time="2026-04-07T17:16:44.939106" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.939153" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.837546" elapsed="0.101645"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:44.939379" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:44.939272" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.939252" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.939877" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.940316" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.940387" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.836677" elapsed="0.103821"/>
</kw>
<msg time="2026-04-07T17:16:44.940598" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:44.940644" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.831793" elapsed="0.108892"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:44.941033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:44.940765" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.940747" elapsed="0.000365"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:44.831650" elapsed="0.109487"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.947193" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.947050" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.947025" elapsed="0.000252"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:44.948547" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:44.948441" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:44.948423" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:44.949135" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:44.948754" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.949563" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:44.949314" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:44.984716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:44.950224" elapsed="0.034791"/>
</kw>
<msg time="2026-04-07T17:16:44.985266" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:44.985314" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.949797" elapsed="0.035555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.036896" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:44.986099" elapsed="0.051029"/>
</kw>
<msg time="2026-04-07T17:16:45.037314" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.037360" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.985591" elapsed="0.051806"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.037748" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.037496" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.037467" elapsed="0.000418"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.038441" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.038057" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.038803" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.038593" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.038575" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.038939" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.041470" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:16:45.042941" elapsed="0.000534"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.044395" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.039931" elapsed="0.004865"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.039311" elapsed="0.005600"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:44.948135" elapsed="0.096893"/>
</kw>
<msg time="2026-04-07T17:16:45.045125" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.045170" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.947467" elapsed="0.097739"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.045395" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.045286" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.045267" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.045897" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.046293" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.046365" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:44.946595" elapsed="0.099881"/>
</kw>
<msg time="2026-04-07T17:16:45.046656" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.046702" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.941425" elapsed="0.105314"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.047186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.046815" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.046798" elapsed="0.000466"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:44.941284" elapsed="0.106005"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:44.705246" elapsed="0.342096"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:44.699460" elapsed="0.347959"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:44.691928" elapsed="0.355570"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:44.691485" elapsed="0.356072"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:44.688438" elapsed="0.359188"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:45.052247" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.047864" elapsed="0.004426">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-04-07T17:16:44.687764" elapsed="0.364720">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t17" name="Check Entity Owner Status And Find Owner and Candidate After Fail" line="89">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:45.056197" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:45.055917" 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-07T17:16:45.057458" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.057341" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.057320" 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-07T17:16:45.062159" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.062050" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.062032" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.063255" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:45.062851" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.063746" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:45.063444" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:45.063815" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:45.063970" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:45.062448" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.071255" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.071143" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.071123" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.072516" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.072410" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.072393" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.073103" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.072721" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.073537" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.073283" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.106769" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.074115" elapsed="0.032886"/>
</kw>
<msg time="2026-04-07T17:16:45.107172" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.107218" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.073715" elapsed="0.033539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.191472" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.107805" elapsed="0.084220"/>
</kw>
<msg time="2026-04-07T17:16:45.192399" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.192448" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.107423" elapsed="0.085063"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.193100" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.192649" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.192592" elapsed="0.000630"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.193926" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.193372" elapsed="0.000674"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.194325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.194114" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.194095" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.194470" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.197153" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:16:45.198650" elapsed="0.000544"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.200162" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.195555" elapsed="0.005022"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.194853" elapsed="0.005838"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.072112" elapsed="0.128680"/>
</kw>
<msg time="2026-04-07T17:16:45.200893" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.200937" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.071468" elapsed="0.129510"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.201197" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.201089" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.201069" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.201708" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.202091" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.202166" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.070761" elapsed="0.131517"/>
</kw>
<msg time="2026-04-07T17:16:45.202376" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.202420" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.064405" elapsed="0.138130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.202871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.202620" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.202602" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:45.064265" elapsed="0.138711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.208620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.208512" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.208494" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.209887" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.209781" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.209764" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.210609" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.210235" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.211056" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.210788" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.248725" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.211613" elapsed="0.037286"/>
</kw>
<msg time="2026-04-07T17:16:45.249087" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.249133" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.211238" elapsed="0.037931"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.361276" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.249721" elapsed="0.112037"/>
</kw>
<msg time="2026-04-07T17:16:45.362238" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.362345" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.249336" elapsed="0.113075"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.362770" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.362509" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.362482" elapsed="0.000393"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.363451" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.363040" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.363824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.363612" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.363594" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.363956" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.366407" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:16:45.367856" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.369309" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.364890" elapsed="0.004813"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.364290" elapsed="0.005597"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.209484" elapsed="0.160508"/>
</kw>
<msg time="2026-04-07T17:16:45.370104" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.370147" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.208832" elapsed="0.161353"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.370369" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.370262" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.370243" elapsed="0.000238"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.370874" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.371228" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.371300" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.208134" elapsed="0.163275"/>
</kw>
<msg time="2026-04-07T17:16:45.371503" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.371546" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.203287" elapsed="0.168295"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.371905" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.371658" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.371641" elapsed="0.000344"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:45.203143" elapsed="0.168879"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.377587" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.377481" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.377462" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.378865" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.378734" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.378713" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.379452" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.379094" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.379876" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.379629" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.413415" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.380455" elapsed="0.033135"/>
</kw>
<msg time="2026-04-07T17:16:45.413761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.413806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.380077" elapsed="0.033765"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.511594" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.414427" elapsed="0.097531"/>
</kw>
<msg time="2026-04-07T17:16:45.512253" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.512305" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.414033" elapsed="0.098310"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.512995" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.512609" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.512554" elapsed="0.000575"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.513796" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.513279" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.514193" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.513959" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.513940" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.514335" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.517057" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:16:45.518589" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.520095" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.515412" elapsed="0.005127"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.514719" elapsed="0.005937"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.378433" elapsed="0.142329"/>
</kw>
<msg time="2026-04-07T17:16:45.520864" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.520911" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.377800" elapsed="0.143150"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.521161" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.521050" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.521029" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.521686" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.522071" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.522144" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.376933" elapsed="0.145326"/>
</kw>
<msg time="2026-04-07T17:16:45.522359" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.522404" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.372300" elapsed="0.150145"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.522772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.522524" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.522506" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:45.372160" elapsed="0.150715"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:45.064076" elapsed="0.458839"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:45.061678" elapsed="0.461310"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:45.057044" elapsed="0.466027"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.056606" elapsed="0.466517"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:45.053777" elapsed="0.469447"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:45.535158" level="FAIL">Variable '${original_candidate}' not found.</msg>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>${original_candidate}</arg>
<arg>${new_cluster_list}</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.531276" elapsed="0.003923">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_candidate}</var>
<arg>${new_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.535375" 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-07T17:16:45.535553" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.535718" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.053147" elapsed="0.482757">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s1-t18" name="Create Bridge Manually and Verify After Fail" line="99">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:45.539708" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:45.539314" elapsed="0.000663"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.540993" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.540851" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.540833" elapsed="0.000247"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.545643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.545536" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.545518" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.546716" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:45.546329" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.547220" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:45.546898" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:45.547290" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:45.547444" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:45.545935" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.552743" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.552637" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.552619" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.554028" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.553899" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.553882" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.554595" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.554238" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.555052" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.554780" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.588818" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.555614" elapsed="0.033488"/>
</kw>
<msg time="2026-04-07T17:16:45.589346" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.589393" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.555234" elapsed="0.034201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.654682" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.590274" elapsed="0.064754"/>
</kw>
<msg time="2026-04-07T17:16:45.655205" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.655252" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.589704" elapsed="0.065585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.655692" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.655413" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.655372" elapsed="0.000433"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.656357" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.655950" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.656727" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.656515" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.656496" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.656867" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.659509" elapsed="0.000555"/>
</kw>
<kw name="Open 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-07T17:16:45.661043" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.662497" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.657913" elapsed="0.004986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.657254" elapsed="0.005793"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.553603" elapsed="0.109551"/>
</kw>
<msg time="2026-04-07T17:16:45.663252" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.663298" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.552954" elapsed="0.110381"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.663524" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.663416" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.663397" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.664128" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.664480" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.664552" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.552301" elapsed="0.112362"/>
</kw>
<msg time="2026-04-07T17:16:45.664764" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.664809" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.547857" elapsed="0.116993"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.665202" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.664931" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.664914" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:45.547715" elapsed="0.117589"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.671105" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.670978" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.670956" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.672396" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.672289" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.672271" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.672970" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.672602" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.673416" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.673166" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.713293" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.673978" elapsed="0.039498"/>
</kw>
<msg time="2026-04-07T17:16:45.713659" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.713705" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.673595" elapsed="0.040146"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.790033" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.714358" elapsed="0.075875"/>
</kw>
<msg time="2026-04-07T17:16:45.790403" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.790465" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.713922" elapsed="0.076581"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.790837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.790591" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.790567" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.791477" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.791106" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.791842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.791633" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.791615" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.791978" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.794350" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:16:45.795809" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.797230" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.792889" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.792302" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.671970" elapsed="0.125867"/>
</kw>
<msg time="2026-04-07T17:16:45.797931" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.797979" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.671355" elapsed="0.126677"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.798217" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.798111" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.798092" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.798698" elapsed="0.000075"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.799103" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.799174" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.670621" elapsed="0.128660"/>
</kw>
<msg time="2026-04-07T17:16:45.799375" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.799418" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.665595" elapsed="0.133859"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.799776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.799531" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.799514" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:45.665455" elapsed="0.134421"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.805377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.805271" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.805253" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.806614" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.806508" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.806491" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.807213" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.806818" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.807640" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.807394" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.840350" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.808267" elapsed="0.032267"/>
</kw>
<msg time="2026-04-07T17:16:45.840702" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.840747" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.807819" elapsed="0.032964"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.900943" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.841355" elapsed="0.059815"/>
</kw>
<msg time="2026-04-07T17:16:45.901343" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:45.901389" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.840948" elapsed="0.060477"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.901749" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.901512" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.901486" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.902395" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:45.901998" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.902784" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.902548" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.902530" elapsed="0.000402"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:45.902968" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:45.905352" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.906782" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:45.908202" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:45.903882" elapsed="0.004741"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:45.903284" elapsed="0.005451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.806212" elapsed="0.102625"/>
</kw>
<msg time="2026-04-07T17:16:45.908928" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.908976" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.805589" elapsed="0.103440"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:45.909215" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:45.909109" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.909090" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.909693" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.910070" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.910143" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.804731" elapsed="0.105519"/>
</kw>
<msg time="2026-04-07T17:16:45.910345" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:45.910389" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.800189" elapsed="0.110235"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:45.910752" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:45.910505" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.910485" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:45.800050" elapsed="0.110801"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:45.547529" elapsed="0.363359"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:45.545179" elapsed="0.365782"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:45.540555" elapsed="0.370509"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.540138" elapsed="0.370980"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:45.536977" elapsed="0.374203"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:45.919391" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.915489" elapsed="0.003943">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.536366" elapsed="0.383245">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t19" name="Add Port Manually and Verify After Fail" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:45.922911" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:45.922654" 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-07T17:16:45.924187" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.924078" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.924060" elapsed="0.000232"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.928833" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.928725" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.928708" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.929892" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:45.929508" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:45.930399" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:45.930093" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:45.930470" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:45.930622" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:45.929139" elapsed="0.001507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.935877" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.935770" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.935752" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:45.937175" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:45.937068" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:45.937050" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:45.937738" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:45.937382" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.938186" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:45.937919" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:45.970384" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:45.938743" elapsed="0.031823"/>
</kw>
<msg time="2026-04-07T17:16:45.970738" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:45.970784" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.938365" elapsed="0.032455"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.058334" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:45.971421" elapsed="0.087334"/>
</kw>
<msg time="2026-04-07T17:16:46.059105" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.059155" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.971025" elapsed="0.088168"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.059844" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.059379" elapsed="0.000556"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.059316" elapsed="0.000658"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.060757" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.060168" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.061158" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.060919" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.060900" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.061306" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.064169" elapsed="0.000574"/>
</kw>
<kw name="Open 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-07T17:16:46.065743" elapsed="0.000552"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.067249" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.062524" elapsed="0.005151"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.061790" elapsed="0.006003"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:45.936747" elapsed="0.131152"/>
</kw>
<msg time="2026-04-07T17:16:46.068034" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.068085" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.936143" elapsed="0.131981"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.068316" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.068207" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.068187" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.068856" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.069240" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.069312" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:45.935435" elapsed="0.133988"/>
</kw>
<msg time="2026-04-07T17:16:46.069528" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.069572" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.931048" elapsed="0.138561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.069939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.069690" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.069670" elapsed="0.000364"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:45.930890" elapsed="0.139169"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.075823" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.075716" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.075696" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.077124" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.076994" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.076972" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:46.077698" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.077332" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.078150" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:46.077878" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.114286" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:46.078710" elapsed="0.035756"/>
</kw>
<msg time="2026-04-07T17:16:46.114634" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:46.114680" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.078328" elapsed="0.036388"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.181020" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:46.115307" elapsed="0.066165"/>
</kw>
<msg time="2026-04-07T17:16:46.181721" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.181770" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.114885" elapsed="0.066924"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.182305" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.181933" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.181898" elapsed="0.000516"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.183061" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.182559" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.183436" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.183220" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.183202" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.183575" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.186119" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:16:46.187607" elapsed="0.000530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.189091" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.184568" elapsed="0.004924"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.183899" elapsed="0.005715"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:46.076691" elapsed="0.113024"/>
</kw>
<msg time="2026-04-07T17:16:46.189811" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.189856" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.076061" elapsed="0.113832"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.190099" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.189976" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.189954" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.190587" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.190924" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.191025" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:46.075352" elapsed="0.115789"/>
</kw>
<msg time="2026-04-07T17:16:46.191239" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.191283" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.070361" elapsed="0.120961"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.191648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.191402" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.191384" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:46.070218" elapsed="0.121531"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.197361" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.197250" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.197231" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.198660" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.198553" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.198534" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:46.199260" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.198867" elapsed="0.000420"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.199685" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:46.199441" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.231358" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:46.200268" elapsed="0.031265"/>
</kw>
<msg time="2026-04-07T17:16:46.231703" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:46.231749" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.199865" elapsed="0.031921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.291534" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:46.232438" elapsed="0.059286"/>
</kw>
<msg time="2026-04-07T17:16:46.291905" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.291952" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.231952" elapsed="0.060036"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.292316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.292099" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.292079" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.292922" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.292554" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.293303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.293092" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.293074" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.293435" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.295721" elapsed="0.000558"/>
</kw>
<kw name="Open 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-07T17:16:46.297207" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.298576" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.294272" elapsed="0.004696"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.293686" elapsed="0.005412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:46.198250" elapsed="0.100946"/>
</kw>
<msg time="2026-04-07T17:16:46.299288" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.299332" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.197612" elapsed="0.101757"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.299551" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.299445" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.299426" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.300046" elapsed="0.000072"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.300425" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.300496" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:46.196773" elapsed="0.103830"/>
</kw>
<msg time="2026-04-07T17:16:46.300696" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.300741" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.192145" elapsed="0.108633"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.301206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.300852" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.300835" elapsed="0.000450"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:46.191881" elapsed="0.109427"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:45.930707" elapsed="0.370632"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:45.928369" elapsed="0.373033"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:45.923778" elapsed="0.377688"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:45.923341" elapsed="0.378173"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:45.920669" elapsed="0.380904"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:46.309572" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:46.305773" elapsed="0.003838">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:45.920044" elapsed="0.389722">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t20" name="Create Tap Device After Fail" line="107">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:46.312936" elapsed="0.000236"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:46.312680" 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-07T17:16:46.314193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.314085" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.314067" 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-07T17:16:46.318768" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.318662" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.318645" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.319827" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:46.319448" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.320331" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:46.320027" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:46.320401" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:46.320553" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:46.319077" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.326993" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.326881" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.326862" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.328268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.328161" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.328143" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:46.328893" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.328536" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.329367" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:46.329120" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.369317" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:46.329928" elapsed="0.039547"/>
</kw>
<msg time="2026-04-07T17:16:46.369662" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:46.369708" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.329548" elapsed="0.040196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.426074" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:46.370368" elapsed="0.055897"/>
</kw>
<msg time="2026-04-07T17:16:46.426438" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.426484" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.369910" elapsed="0.056611"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.426837" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.426602" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.426581" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.427476" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.427099" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.427835" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.427624" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.427606" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.427970" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.430332" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.431765" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.433194" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.428870" elapsed="0.004708"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.428257" elapsed="0.005432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:46.327831" elapsed="0.105959"/>
</kw>
<msg time="2026-04-07T17:16:46.433880" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.433924" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.327223" elapsed="0.106737"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.434164" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.434057" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.434037" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.434632" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.435045" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.435118" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:46.326544" elapsed="0.108681"/>
</kw>
<msg time="2026-04-07T17:16:46.435316" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.435359" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.320959" elapsed="0.114436"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.435713" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.435469" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.435452" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:46.320823" elapsed="0.114990"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.441290" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.440982" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.440963" elapsed="0.000395"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.442544" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.442439" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.442422" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:46.443121" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.442749" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.443541" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:46.443300" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.480654" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:46.444113" elapsed="0.036715"/>
</kw>
<msg time="2026-04-07T17:16:46.481015" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:46.481062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.443718" elapsed="0.037380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.541333" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:46.481650" elapsed="0.059881"/>
</kw>
<msg time="2026-04-07T17:16:46.541701" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.541746" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.481265" elapsed="0.060518"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.542104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.541861" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.541841" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.542709" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.542343" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.543088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.542855" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.542837" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.543220" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.545508" elapsed="0.000582"/>
</kw>
<kw name="Open 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-07T17:16:46.547038" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.548433" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.544051" elapsed="0.004765"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.543468" elapsed="0.005462"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:46.442142" elapsed="0.106906"/>
</kw>
<msg time="2026-04-07T17:16:46.549140" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.549183" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.441504" elapsed="0.107715"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.549401" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.549295" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.549277" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.549856" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.550195" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.550266" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:46.440631" elapsed="0.109740"/>
</kw>
<msg time="2026-04-07T17:16:46.550462" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.550505" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.436092" elapsed="0.114449"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.550856" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.550615" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.550598" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:46.435934" elapsed="0.115021"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.556316" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.556210" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.556191" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.557579" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:46.557475" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.557457" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:46.558152" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:46.557786" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.558569" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:46.558330" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.590284" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:46.559207" elapsed="0.031239"/>
</kw>
<msg time="2026-04-07T17:16:46.590614" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:46.590659" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.558748" elapsed="0.031947"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.639633" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:46.591275" elapsed="0.048582"/>
</kw>
<msg time="2026-04-07T17:16:46.640054" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:46.640101" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.590861" elapsed="0.049277"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.640432" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.640214" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.640195" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.641053" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:46.640668" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.641411" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.641201" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.641183" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:46.641542" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.643855" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:16:46.645310" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:46.646756" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:46.642373" elapsed="0.004790"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:46.641789" elapsed="0.005487"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:46.557178" elapsed="0.090197"/>
</kw>
<msg time="2026-04-07T17:16:46.647465" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.647508" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.556527" elapsed="0.091017"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:46.647754" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:46.647620" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.647601" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.648236" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.648559" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:46.648629" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:46.555855" elapsed="0.092879"/>
</kw>
<msg time="2026-04-07T17:16:46.648825" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:46.648867" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.551240" elapsed="0.097663"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:46.649239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.648981" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.648960" elapsed="0.000356"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:46.551106" elapsed="0.098232"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:46.320630" elapsed="0.328737"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:46.318300" elapsed="0.331121"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:46.313782" elapsed="0.335729"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:46.313369" elapsed="0.336189"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:46.310678" elapsed="0.338933"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:16:46.652089" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:46.651800" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:46.651778" elapsed="0.000392"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.652634" 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-07T17:16:46.652737" 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-07T17:16:46.652313" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.653309" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:16:46.652911" elapsed="0.000444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.653880" level="INFO">${conn_id} = 107</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-07T17:16:46.653506" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:46.654832" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:46.654908" 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-07T17:16:46.654536" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.655344" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:46.656529" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:47.047868" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:36 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:46.656215" elapsed="0.391753"/>
</kw>
<msg time="2026-04-07T17:16:47.048051" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.655824" elapsed="0.392288"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:46.654148" elapsed="0.394048"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.048571" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:16:47.060862" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:16:47.061166" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:47.061265" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:47.048379" elapsed="0.012937"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.061673" elapsed="0.000505"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.063146" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:47.062545" elapsed="0.000700"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.063659" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:47.063402" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.063359" elapsed="0.000450"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:47.064193" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:16:47.063925" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.063891" elapsed="0.000483"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.064447" elapsed="0.000030"/>
</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-07T17:16:47.068832" elapsed="0.000455"/>
</kw>
<kw name="Open 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-07T17:16:47.069526" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.069932" elapsed="0.000157"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:47.065284" elapsed="0.004877"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:46.651280" elapsed="0.419004"/>
</kw>
<msg time="2026-04-07T17:16:47.070356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:46.650706" elapsed="0.419716"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:46.650223" elapsed="0.420304"/>
</kw>
<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-07T17:16:47.073403" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:47.073039" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.073011" elapsed="0.000538"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.073922" 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-07T17:16:47.074039" 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-07T17:16:47.073757" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.074594" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:16:47.074216" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.075167" level="INFO">${conn_id} = 109</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-07T17:16:47.074792" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.076067" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:47.076144" 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-07T17:16:47.075785" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.076322" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.077475" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:47.394199" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:47 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:47.077164" elapsed="0.317129"/>
</kw>
<msg time="2026-04-07T17:16:47.394356" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.076798" elapsed="0.317613"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:47.075399" elapsed="0.319096"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.394857" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:16:47.407544" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:16:47.407744" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:47.407805" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:47.394667" elapsed="0.013172"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.408092" elapsed="0.000523"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.409245" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:47.408852" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.409569" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:47.409406" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.409378" elapsed="0.000287"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:47.409883" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-07T17:16:47.409739" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.409718" elapsed="0.000304"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.410072" elapsed="0.000020"/>
</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-07T17:16:47.413634" elapsed="0.000457"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:47.414316" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.414720" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:47.410484" elapsed="0.004443"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:47.072293" elapsed="0.342784"/>
</kw>
<msg time="2026-04-07T17:16:47.415150" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.071508" elapsed="0.343708"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:47.070790" elapsed="0.344533"/>
</kw>
<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-07T17:16:47.418215" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:47.417826" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.417800" elapsed="0.000527"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.418705" 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-07T17:16:47.418843" 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-07T17:16:47.418528" elapsed="0.000352"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.419667" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:16:47.419105" elapsed="0.000627"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.420463" level="INFO">${conn_id} = 111</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-07T17:16:47.419944" elapsed="0.000556"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.421730" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:47.421807" 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-07T17:16:47.421356" elapsed="0.000475"/>
</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-07T17:16:47.421986" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.423152" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:47.744969" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:47 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:47.422822" elapsed="0.322323"/>
</kw>
<msg time="2026-04-07T17:16:47.745211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.422476" elapsed="0.322796"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:47.420791" elapsed="0.324572"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.745723" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:16:47.758317" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:16:47.758551" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:47.758649" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:47.745546" elapsed="0.013156"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.759106" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.760538" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:47.759926" elapsed="0.000716"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.761100" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:47.760801" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.760755" elapsed="0.000499"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:47.761658" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:16:47.761374" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.761340" elapsed="0.000519"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:47.761939" elapsed="0.000024"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.765578" elapsed="0.000483"/>
</kw>
<kw name="Open 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-07T17:16:47.766288" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:47.766696" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:47.762382" elapsed="0.004522"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:47.417097" elapsed="0.349958"/>
</kw>
<msg time="2026-04-07T17:16:47.767132" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.416318" elapsed="0.350881"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:47.415609" elapsed="0.351702"/>
</kw>
<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-07T17:16:47.770234" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:47.769818" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:47.769788" elapsed="0.000560"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.770729" 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-07T17:16:47.770889" 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-07T17:16:47.770549" elapsed="0.000386"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.771509" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:16:47.771128" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.772084" level="INFO">${conn_id} = 113</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-07T17:16:47.771706" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:47.772978" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:16:47.773071" 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-07T17:16:47.772708" elapsed="0.000387"/>
</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-07T17:16:47.773288" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:16:47.774467" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:16:48.155803" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:16:03 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:47 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:16:47.774153" elapsed="0.381749"/>
</kw>
<msg time="2026-04-07T17:16:48.155971" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.773771" elapsed="0.382280"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:16:47.772320" elapsed="0.383825"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.156536" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:16:48.170084" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:16:48.170322" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:16:48.170420" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:16:48.156336" elapsed="0.014137"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.170828" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.172306" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.171682" elapsed="0.000725"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.172832" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.172564" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.172520" elapsed="0.000498"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:16:48.173399" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.173163" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.173127" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.173659" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.178664" elapsed="0.000322"/>
</kw>
<kw name="Open 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-07T17:16:48.179174" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.179467" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.174390" elapsed="0.005224"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:16:47.769083" elapsed="0.410622"/>
</kw>
<msg time="2026-04-07T17:16:48.179758" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:47.768293" elapsed="0.411513"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:16:47.767579" elapsed="0.412308"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:16:46.649833" elapsed="1.530112"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:16:46.310155" elapsed="1.869928"/>
</test>
<test id="s1-s1-s1-t21" name="Add Tap Device Manually and Verify After Fail" line="111">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:48.183811" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:48.183555" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.185128" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.184946" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.184928" elapsed="0.000271"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.189767" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.189660" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.189642" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.190826" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:48.190446" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.191333" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:48.191026" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:48.191403" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:48.191557" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:48.190074" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.196872" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.196762" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.196742" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.198214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.198107" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.198089" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.198808" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.198423" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.199273" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.199007" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.237228" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.199850" elapsed="0.037544"/>
</kw>
<msg time="2026-04-07T17:16:48.237568" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.237614" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.199459" elapsed="0.038192"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.307212" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.238231" elapsed="0.069194"/>
</kw>
<msg time="2026-04-07T17:16:48.307598" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.307644" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.237818" elapsed="0.069864"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.307984" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.307761" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.307740" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.308650" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.308254" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.309033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.308802" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.308783" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.309207" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.311489" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:16:48.312946" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.314367" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.310052" elapsed="0.004708"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.309464" elapsed="0.005410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.197780" elapsed="0.117198"/>
</kw>
<msg time="2026-04-07T17:16:48.315085" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.315129" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.197106" elapsed="0.118062"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:48.315353" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.315246" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.315227" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.315825" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.316167" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.316239" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.196427" elapsed="0.119919"/>
</kw>
<msg time="2026-04-07T17:16:48.316439" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.316482" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.191956" elapsed="0.124564"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.316867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.316595" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.316578" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:48.191816" elapsed="0.125153"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.322160" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.322051" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.322031" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.323417" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.323310" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.323292" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.323984" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.323622" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.324420" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.324177" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.379601" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.325020" elapsed="0.054760"/>
</kw>
<msg time="2026-04-07T17:16:48.379950" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.380037" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.324601" elapsed="0.055475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.472743" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.380680" elapsed="0.092260"/>
</kw>
<msg time="2026-04-07T17:16:48.473135" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.473181" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.380243" elapsed="0.092976"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.473516" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.473298" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.473278" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.474158" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.473754" elapsed="0.000493"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.474524" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.474315" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.474297" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.474654" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.476965" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:16:48.478434" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.479838" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.475490" elapsed="0.004755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.474903" elapsed="0.005455"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.323006" elapsed="0.157452"/>
</kw>
<msg time="2026-04-07T17:16:48.480549" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.480593" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.322374" elapsed="0.158257"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:48.480814" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.480708" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.480690" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.481325" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.481649" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.481721" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.321683" elapsed="0.160144"/>
</kw>
<msg time="2026-04-07T17:16:48.481920" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.481969" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.317243" elapsed="0.164796"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.482360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.482117" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.482100" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:48.317109" elapsed="0.165352"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.487996" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.487865" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.487845" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.489299" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.489191" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.489171" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.489856" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.489504" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.490297" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.490055" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.533547" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.490853" elapsed="0.042862"/>
</kw>
<msg time="2026-04-07T17:16:48.533883" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.533929" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.490476" elapsed="0.043493"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.600419" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.534567" elapsed="0.066046"/>
</kw>
<msg time="2026-04-07T17:16:48.600787" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.600834" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.534163" elapsed="0.066706"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.601198" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.600949" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.600928" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.601813" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.601439" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.602194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.601960" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.601941" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.602326" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.604633" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:16:48.606071" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.607489" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.603174" elapsed="0.004701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.602581" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.488833" elapsed="0.119309"/>
</kw>
<msg time="2026-04-07T17:16:48.608253" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.608298" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.488219" elapsed="0.120114"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:48.608586" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.608478" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.608459" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.609069" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.609399" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.609470" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.487453" elapsed="0.122126"/>
</kw>
<msg time="2026-04-07T17:16:48.609673" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.609717" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.482762" elapsed="0.126993"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.610093" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.609831" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.609814" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:48.482626" elapsed="0.127568"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:48.191638" elapsed="0.418586"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:48.189288" elapsed="0.420993"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:48.184654" elapsed="0.425684"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.184235" elapsed="0.426149"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:48.181361" elapsed="0.429076"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:48.618481" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:48.614502" elapsed="0.004018">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:48.180632" elapsed="0.438038">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t22" name="Delete the Bridge Manually and Verify After Fail" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:48.622588" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:48.622331" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.623821" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.623713" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.623694" 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-07T17:16:48.628409" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.628302" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.628285" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.629482" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:48.629105" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.629966" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:48.629663" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:48.630055" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:48.630210" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:48.628694" elapsed="0.001540"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.636970" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.636839" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.636819" elapsed="0.000235"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.638247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.638140" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.638122" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.638808" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.638454" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.639256" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.639008" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.676559" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.639814" elapsed="0.036922"/>
</kw>
<msg time="2026-04-07T17:16:48.676905" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.676951" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.639436" elapsed="0.037573"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.745373" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.677563" elapsed="0.068013"/>
</kw>
<msg time="2026-04-07T17:16:48.745743" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.745789" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.677177" elapsed="0.068649"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.746146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.745905" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.745885" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.746753" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.746383" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.747136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.746906" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.746888" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.747269" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.749581" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.751030" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.752422" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.748130" elapsed="0.004678"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.747526" elapsed="0.005396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.637815" elapsed="0.115223"/>
</kw>
<msg time="2026-04-07T17:16:48.753130" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.753175" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.637202" elapsed="0.116009"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:48.753433" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.753326" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.753306" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.753899" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.754243" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.754313" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.636501" elapsed="0.117918"/>
</kw>
<msg time="2026-04-07T17:16:48.754511" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.754556" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.630590" elapsed="0.124002"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.754908" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.754666" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.754649" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:48.630454" elapsed="0.124588"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.760412" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.760305" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.760287" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.761661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.761555" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.761537" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.762237" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.761865" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.762656" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.762416" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.800118" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.763302" elapsed="0.036986"/>
</kw>
<msg time="2026-04-07T17:16:48.800458" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.800504" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.762838" elapsed="0.037703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.878047" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.801139" elapsed="0.077102"/>
</kw>
<msg time="2026-04-07T17:16:48.878407" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.878454" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.800714" elapsed="0.077776"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.878784" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.878568" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.878548" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.879434" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.879050" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.879836" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.879624" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.879606" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.879972" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:48.882249" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.883705" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:48.885113" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:48.880806" elapsed="0.004693"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.880239" elapsed="0.005373"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.761256" elapsed="0.124456"/>
</kw>
<msg time="2026-04-07T17:16:48.885803" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.885847" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.760628" elapsed="0.125256"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:48.886088" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:48.885966" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.885943" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.886552" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.886884" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.886956" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.759922" elapsed="0.127158"/>
</kw>
<msg time="2026-04-07T17:16:48.887174" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:48.887218" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.755301" elapsed="0.131954"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.887586" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.887331" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.887313" elapsed="0.000350"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:48.755165" elapsed="0.132521"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.892922" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.892814" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.892796" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:48.894205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:48.894099" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.894081" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:48.894762" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:48.894410" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.895202" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:48.894940" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.929623" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:48.895779" elapsed="0.034011"/>
</kw>
<msg time="2026-04-07T17:16:48.930044" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:48.930105" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.895388" elapsed="0.034764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:48.996961" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:48.930732" elapsed="0.066597"/>
</kw>
<msg time="2026-04-07T17:16:48.997612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:48.997661" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.930333" elapsed="0.067365"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.998284" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.997849" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.997797" elapsed="0.000607"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:48.999104" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:48.998556" elapsed="0.000644"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:48.999482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:48.999269" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:48.999250" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:48.999621" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.002224" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:16:49.003731" elapsed="0.000525"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.005211" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.000663" elapsed="0.004958"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:48.999984" elapsed="0.005753"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:48.893781" elapsed="0.112058"/>
</kw>
<msg time="2026-04-07T17:16:49.005939" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.005988" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.893166" elapsed="0.112874"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.006232" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.006122" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.006102" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.006757" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.007140" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.007216" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:48.892477" elapsed="0.114853"/>
</kw>
<msg time="2026-04-07T17:16:49.007430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.007474" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.887941" elapsed="0.119574"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.007910" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.007660" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.007641" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:48.887806" elapsed="0.120238"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:48.630286" elapsed="0.377804"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:48.627933" elapsed="0.380237"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:48.623430" elapsed="0.384808"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:48.623013" elapsed="0.385275"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:48.620103" elapsed="0.388245"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:49.016693" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.012809" elapsed="0.003926">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:48.619269" elapsed="0.397636">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t23" name="Create Bridge In Owner and Verify After Fail" line="119">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:49.020190" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:49.019915" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.021434" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.021325" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.021306" 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-07T17:16:49.026163" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.025962" elapsed="0.000248"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.025945" elapsed="0.000288"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.027264" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:49.026832" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.027746" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:49.027446" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:49.027815" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:49.027971" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:49.026457" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.033246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.033139" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.033120" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.034509" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.034402" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.034384" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.035103" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.034717" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.035564" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.035313" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.071045" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.036143" elapsed="0.035081"/>
</kw>
<msg time="2026-04-07T17:16:49.071396" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.071443" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.035744" elapsed="0.035783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.148678" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.072143" elapsed="0.076733"/>
</kw>
<msg time="2026-04-07T17:16:49.149068" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.149116" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.071704" elapsed="0.077448"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.149455" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.149231" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.149211" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.150117" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.149697" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.150480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.150269" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.150251" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.150612" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.152908" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:16:49.154400" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.155796" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.151454" elapsed="0.004754"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.150864" elapsed="0.005457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.034101" elapsed="0.122320"/>
</kw>
<msg time="2026-04-07T17:16:49.156511" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.156555" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.033460" elapsed="0.123131"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.156775" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.156668" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.156649" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.157262" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.157595" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.157666" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.032788" elapsed="0.124985"/>
</kw>
<msg time="2026-04-07T17:16:49.157864" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.158146" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.028395" elapsed="0.129865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.158662" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.158385" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.158357" elapsed="0.000428"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:49.028254" elapsed="0.130554"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.164285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.164178" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.164159" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.165531" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.165425" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.165407" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.166225" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.165735" elapsed="0.000516"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.166658" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.166405" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.201253" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.167241" elapsed="0.034170"/>
</kw>
<msg time="2026-04-07T17:16:49.201578" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.201624" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.166840" elapsed="0.034820"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.272938" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.202316" elapsed="0.070834"/>
</kw>
<msg time="2026-04-07T17:16:49.273317" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.273362" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.201846" elapsed="0.071552"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.273689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.273474" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.273455" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.274314" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.273928" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.274674" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.274465" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.274447" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.274803" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.277258" elapsed="0.000570"/>
</kw>
<kw name="Open 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-07T17:16:49.278744" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.280113" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.275639" elapsed="0.004858"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.275067" elapsed="0.005541"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.165126" elapsed="0.115606"/>
</kw>
<msg time="2026-04-07T17:16:49.280825" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.280911" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.164498" elapsed="0.116453"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.281167" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.281058" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.281039" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.281630" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.281956" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.282145" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.163815" elapsed="0.118439"/>
</kw>
<msg time="2026-04-07T17:16:49.282346" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.282389" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.159093" elapsed="0.123332"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.282744" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.282499" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.282483" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:49.158930" elapsed="0.123915"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.288109" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.287987" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.287965" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.289379" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.289273" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.289255" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.289931" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.289584" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.290554" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.290311" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.323066" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.291123" elapsed="0.032102"/>
</kw>
<msg time="2026-04-07T17:16:49.323392" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.323437" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.290731" elapsed="0.032742"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.388052" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.324043" elapsed="0.064204"/>
</kw>
<msg time="2026-04-07T17:16:49.388415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.388460" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.323638" elapsed="0.064858"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.388790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.388572" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.388552" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.389466" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.389059" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.389829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.389618" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.389600" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.389961" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.392264" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.393703" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.395109" elapsed="0.000597"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.390796" elapsed="0.005012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.390230" elapsed="0.005698"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.288957" elapsed="0.107092"/>
</kw>
<msg time="2026-04-07T17:16:49.396151" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.396199" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.288322" elapsed="0.107913"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.396424" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.396316" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.396294" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.396899" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.397247" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.397319" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.287647" elapsed="0.109777"/>
</kw>
<msg time="2026-04-07T17:16:49.397516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.397559" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.283121" elapsed="0.114473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.397920" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.397668" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.397651" elapsed="0.000362"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:49.282965" elapsed="0.115072"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:49.028070" elapsed="0.369996"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:49.025605" elapsed="0.372515"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:49.021036" elapsed="0.377139"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.020599" elapsed="0.377620"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:49.017729" elapsed="0.380541"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:49.409924" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.406202" elapsed="0.003760">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.017170" elapsed="0.392944">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t24" name="Create Port In Owner and Verify After Fail" line="123">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:49.413341" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:49.413084" 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-07T17:16:49.414561" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.414451" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.414433" 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-07T17:16:49.419130" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.419021" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.419003" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.420203" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:49.419778" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.420684" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:49.420383" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:49.420753" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:49.420905" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:49.419412" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.426131" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.426020" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.426001" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.427380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.427275" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.427257" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.427934" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.427585" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.428395" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.428153" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.461840" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.428953" elapsed="0.033125"/>
</kw>
<msg time="2026-04-07T17:16:49.462251" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.462297" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.428576" elapsed="0.033756"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.524032" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.462899" elapsed="0.061462"/>
</kw>
<msg time="2026-04-07T17:16:49.524611" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.524657" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.462499" elapsed="0.062194"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.525190" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.524819" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.524780" elapsed="0.000523"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.525947" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.525446" elapsed="0.000675"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.526435" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.526191" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.526172" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.526572" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.529133" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:16:49.530642" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.532105" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.527566" elapsed="0.004937"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.526909" elapsed="0.005709"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.426952" elapsed="0.105787"/>
</kw>
<msg time="2026-04-07T17:16:49.532838" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.532882" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.426343" elapsed="0.106577"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.533176" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.533065" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.533042" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.533668" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.534112" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.534186" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.425670" elapsed="0.108624"/>
</kw>
<msg time="2026-04-07T17:16:49.534391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.534462" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.421297" elapsed="0.113203"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.534822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.534577" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.534560" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:49.421163" elapsed="0.113760"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.540476" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.540368" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.540350" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.541714" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.541609" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.541591" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.542315" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.541917" elapsed="0.000425"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.542776" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.542496" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.580716" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.543349" elapsed="0.037604"/>
</kw>
<msg time="2026-04-07T17:16:49.581289" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.581337" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.542954" elapsed="0.038421"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.665694" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.582111" elapsed="0.083781"/>
</kw>
<msg time="2026-04-07T17:16:49.666084" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.666130" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.581603" elapsed="0.084563"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.666501" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.666260" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.666232" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.667150" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.666751" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.667519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.667308" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.667289" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.667653" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.670104" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.671562" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.672959" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.668580" elapsed="0.004788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.667958" elapsed="0.005522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.541312" elapsed="0.132303"/>
</kw>
<msg time="2026-04-07T17:16:49.673714" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.673760" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.540688" elapsed="0.133109"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.674000" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.673877" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.673858" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.674491" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.674831" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.674905" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.540019" elapsed="0.135032"/>
</kw>
<msg time="2026-04-07T17:16:49.675153" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.675198" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.535219" elapsed="0.140016"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.675600" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.675351" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.675332" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:49.535079" elapsed="0.140622"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.681235" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.681127" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.681108" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.682519" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.682414" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.682396" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.683129" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.682725" elapsed="0.000430"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.683554" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.683308" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.715483" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.684196" elapsed="0.031461"/>
</kw>
<msg time="2026-04-07T17:16:49.715823" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.715868" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.683732" elapsed="0.032172"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.784605" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.716539" elapsed="0.068254"/>
</kw>
<msg time="2026-04-07T17:16:49.784958" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.785026" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.716153" elapsed="0.068911"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.785355" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.785141" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.785121" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.785955" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.785593" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.786335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.786126" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.786108" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.786465" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.788726" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:16:49.790165" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.791530" elapsed="0.000313"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.787291" elapsed="0.004621"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.786711" elapsed="0.005330"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.682115" elapsed="0.110027"/>
</kw>
<msg time="2026-04-07T17:16:49.792281" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.792327" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.681448" elapsed="0.110916"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.792547" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.792440" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.792421" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.793024" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.793349" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.793420" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.680761" elapsed="0.112765"/>
</kw>
<msg time="2026-04-07T17:16:49.793616" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.793659" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.675976" elapsed="0.117720"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.794043" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.793768" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.793752" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:49.675836" elapsed="0.118308"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:49.420983" elapsed="0.373191"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:49.418652" elapsed="0.375588"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:49.414169" elapsed="0.380133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.413741" elapsed="0.380614"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:49.411043" elapsed="0.383372"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:49.806022" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.802507" elapsed="0.003555">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.410468" elapsed="0.395761">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t25" name="Modify the destination IP of Port In Owner After Fail" line="127">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:49.810109" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:49.809829" 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-07T17:16:49.811343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.811233" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.811215" 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-07T17:16:49.816044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.815918" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.815900" elapsed="0.000212"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.817139" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:49.816709" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.817621" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:49.817322" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:49.817689" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:49.817840" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:49.816340" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.824610" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.824503" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.824485" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.825880" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.825775" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.825758" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.826462" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.826108" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.826880" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.826639" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.858804" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.827458" elapsed="0.031509"/>
</kw>
<msg time="2026-04-07T17:16:49.859150" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.859195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.827079" elapsed="0.032151"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.931530" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.859776" elapsed="0.071952"/>
</kw>
<msg time="2026-04-07T17:16:49.931896" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:49.931940" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.859394" elapsed="0.072586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.932301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.932082" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.932061" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:49.932904" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:49.932539" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.933285" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.933076" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.933058" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:49.933415" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:49.935715" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:16:49.937172" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:49.938545" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:49.934250" elapsed="0.004684"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:49.933660" elapsed="0.005406"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.825478" elapsed="0.113686"/>
</kw>
<msg time="2026-04-07T17:16:49.939258" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.939301" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.824827" elapsed="0.114541"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:49.939569" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:49.939447" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.939428" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.940045" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.940368" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.940438" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.824165" elapsed="0.116379"/>
</kw>
<msg time="2026-04-07T17:16:49.940634" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:49.940677" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.818292" elapsed="0.122421"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:49.941044" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:49.940787" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.940770" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:49.818154" elapsed="0.122992"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.946286" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.946180" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.946161" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:49.947523" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:49.947418" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:49.947401" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:49.948109" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:49.947739" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.948536" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:49.948293" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:49.979555" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:49.949113" elapsed="0.030615"/>
</kw>
<msg time="2026-04-07T17:16:49.979896" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:49.979942" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.948716" elapsed="0.031326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.058423" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:49.980616" elapsed="0.078001"/>
</kw>
<msg time="2026-04-07T17:16:50.058786" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.058831" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.980211" elapsed="0.078656"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.059188" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.058943" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.058924" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.059798" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.059433" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.060221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.060006" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.059972" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.060354" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.062630" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:16:50.064082" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.065483" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.061184" elapsed="0.004690"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.060600" elapsed="0.005405"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:49.947122" elapsed="0.118984"/>
</kw>
<msg time="2026-04-07T17:16:50.066195" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.066239" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.946498" elapsed="0.119777"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.066483" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.066375" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.066333" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.066940" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.067284" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.067355" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:49.945821" elapsed="0.121640"/>
</kw>
<msg time="2026-04-07T17:16:50.067551" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.067594" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.941396" elapsed="0.126233"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.067942" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.067703" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.067686" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:49.941264" elapsed="0.126812"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.073414" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.073306" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.073287" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.074683" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.074576" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.074557" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.075257" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.074888" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.075673" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.075435" elapsed="0.000264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.110632" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.076326" elapsed="0.034483"/>
</kw>
<msg time="2026-04-07T17:16:50.111034" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.111082" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.075850" elapsed="0.035268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.188764" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.111688" elapsed="0.077315"/>
</kw>
<msg time="2026-04-07T17:16:50.189179" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.189226" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.111302" elapsed="0.077961"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.189566" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.189344" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.189323" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.190202" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.189806" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.190578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.190365" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.190343" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.190710" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.193008" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.194442" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.195814" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.191550" elapsed="0.004670"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.190960" elapsed="0.005378"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.074244" elapsed="0.122195"/>
</kw>
<msg time="2026-04-07T17:16:50.196530" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.196576" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.073625" elapsed="0.122989"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.196799" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.196691" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.196672" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.197305" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.197633" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.197706" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.072787" elapsed="0.125026"/>
</kw>
<msg time="2026-04-07T17:16:50.197906" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.197950" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.068333" elapsed="0.129687"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.198378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.198132" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.198113" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:50.068195" elapsed="0.130285"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:49.817959" elapsed="0.380550"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:49.815557" elapsed="0.383006"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:49.810930" elapsed="0.387689"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:49.810518" elapsed="0.388146"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:49.807418" elapsed="0.391298"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:50.206734" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:16:50.203133" elapsed="0.003639">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:16:49.806722" elapsed="0.400191">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t26" name="Verify Port Is Modified After Fail" 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-07T17:16:50.210527" elapsed="0.000231"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:50.210269" 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-07T17:16:50.212025" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.211882" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.211860" 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-07T17:16:50.217877" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.217749" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.217728" elapsed="0.000232"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.219177" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:50.218713" elapsed="0.000494"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.219674" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:50.219367" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:50.219744" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:50.219903" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:50.218268" elapsed="0.001660"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.225250" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.225137" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.225117" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.226607" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.226499" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.226481" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.227229" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.226815" elapsed="0.000443"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.227667" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.227415" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.261649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.228256" elapsed="0.033584"/>
</kw>
<msg time="2026-04-07T17:16:50.262046" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.262094" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.227847" elapsed="0.034356"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.328568" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.262845" elapsed="0.065910"/>
</kw>
<msg time="2026-04-07T17:16:50.328922" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.328971" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.262429" elapsed="0.066604"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.329347" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.329116" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.329094" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.329973" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.329591" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.330360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.330141" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.330123" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.330492" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.332917" elapsed="0.000553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.334399" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.335828" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.331405" elapsed="0.004846"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.330796" elapsed="0.005571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.226196" elapsed="0.110272"/>
</kw>
<msg time="2026-04-07T17:16:50.336560" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.336605" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.225468" elapsed="0.111174"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.336826" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.336718" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.336699" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.337348" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.337686" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.337757" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.224774" elapsed="0.113091"/>
</kw>
<msg time="2026-04-07T17:16:50.337958" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.338113" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.220317" elapsed="0.117836"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.338476" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.338230" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.338212" elapsed="0.000381"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:50.220180" elapsed="0.118437"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.344041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.343917" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.343898" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.345300" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.345190" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.345171" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.345859" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.345506" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.346305" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.346055" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.382015" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.346862" elapsed="0.035453"/>
</kw>
<msg time="2026-04-07T17:16:50.382608" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.382676" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.346485" elapsed="0.036244"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.441725" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.383718" elapsed="0.058240"/>
</kw>
<msg time="2026-04-07T17:16:50.442160" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.442206" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.383071" elapsed="0.059172"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.442595" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.442341" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.442312" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.443245" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.442843" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.443630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.443402" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.443384" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.443768" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.446271" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:16:50.447739" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.449166" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.444719" elapsed="0.004851"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.444107" elapsed="0.005577"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.344860" elapsed="0.104925"/>
</kw>
<msg time="2026-04-07T17:16:50.449883" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.449928" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.344254" elapsed="0.105816"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.450268" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.450157" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.450137" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.450760" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.451206" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.451279" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.343564" elapsed="0.107828"/>
</kw>
<msg time="2026-04-07T17:16:50.451492" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.451536" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.338891" elapsed="0.112682"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.451899" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.451652" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.451634" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:50.338752" elapsed="0.113267"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.457580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.457472" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.457453" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.458853" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.458747" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.458730" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.459449" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.459087" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.459875" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.459627" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.492562" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.460458" elapsed="0.032270"/>
</kw>
<msg time="2026-04-07T17:16:50.492903" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.492951" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.460074" elapsed="0.032937"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.550854" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.493592" elapsed="0.057480"/>
</kw>
<msg time="2026-04-07T17:16:50.551244" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.551289" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.493185" elapsed="0.058141"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.551625" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.551408" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.551388" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.552292" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.551869" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.552707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.552494" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.552475" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.552842" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.555148" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:16:50.556639" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.558047" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.553687" elapsed="0.004753"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.553112" elapsed="0.005440"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.458450" elapsed="0.100201"/>
</kw>
<msg time="2026-04-07T17:16:50.558741" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.558784" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.457795" elapsed="0.101026"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.559021" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.558897" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.558878" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.559487" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.559813" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.559884" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.457121" elapsed="0.102895"/>
</kw>
<msg time="2026-04-07T17:16:50.560113" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.560171" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.452301" elapsed="0.107906"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.560524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.560281" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.560264" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:50.452163" elapsed="0.108461"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:50.220003" elapsed="0.340651"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:50.217298" elapsed="0.343421"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:50.211546" elapsed="0.349236"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.211035" elapsed="0.349798"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:50.207879" elapsed="0.353014"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-04-07T17:16:50.569039" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:16:50.565286" elapsed="0.003792">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:16:50.207398" elapsed="0.361847">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s1-t27" name="Start Old Owner Instance" line="135">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:50.572957" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:50.572701" 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-07T17:16:50.574262" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.574151" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.574133" 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-07T17:16:50.578846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.578740" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.578723" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.579909" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:50.579524" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.580419" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:50.580112" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:50.580489" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:50.580672" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:50.579149" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.585925" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.585815" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.585796" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.587213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.587108" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.587090" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.587766" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.587416" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.588203" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.587944" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.621253" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.588784" elapsed="0.032874"/>
</kw>
<msg time="2026-04-07T17:16:50.622069" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.622176" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.588383" elapsed="0.033874"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.673139" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.622882" elapsed="0.050446"/>
</kw>
<msg time="2026-04-07T17:16:50.673497" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.673543" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.622485" elapsed="0.051095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.673891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.673657" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.673637" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.674552" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.674160" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.674911" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.674699" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.674681" elapsed="0.000383"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.675098" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.677383" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:16:50.678854" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.680253" elapsed="0.000357"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.675933" elapsed="0.004747"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.675352" elapsed="0.005441"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.586777" elapsed="0.094117"/>
</kw>
<msg time="2026-04-07T17:16:50.681001" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.681048" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.586158" elapsed="0.094927"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.681269" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.681162" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.681143" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.681734" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.682091" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.682163" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.585477" elapsed="0.096793"/>
</kw>
<msg time="2026-04-07T17:16:50.682363" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.682407" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.581088" elapsed="0.101356"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.682776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.682519" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.682502" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:50.580933" elapsed="0.101943"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.688334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.688222" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.688204" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.689595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.689488" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.689471" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.690172" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.689801" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.690592" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.690351" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.724603" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.691184" elapsed="0.033578"/>
</kw>
<msg time="2026-04-07T17:16:50.724931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.725000" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.690789" elapsed="0.034250"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.773851" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.725647" elapsed="0.048411"/>
</kw>
<msg time="2026-04-07T17:16:50.774229" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.774277" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.725252" elapsed="0.049062"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.774610" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.774391" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.774372" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.775257" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.774849" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.775616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.775404" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.775386" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.775749" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.778065" elapsed="0.000549"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.779542" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.781018" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.776613" elapsed="0.004817"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.776019" elapsed="0.005523"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.689187" elapsed="0.092461"/>
</kw>
<msg time="2026-04-07T17:16:50.781739" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.781784" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.688548" elapsed="0.093272"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.782019" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.781896" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.781878" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.782489" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.782817" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.782888" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.687864" elapsed="0.095160"/>
</kw>
<msg time="2026-04-07T17:16:50.783120" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.783165" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.683255" elapsed="0.099947"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.783520" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.783277" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.783260" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:50.683118" elapsed="0.100502"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.789120" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.789010" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.788975" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.790377" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.790271" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.790253" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.790932" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.790581" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.791372" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.791130" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.823871" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.791927" elapsed="0.032118"/>
</kw>
<msg time="2026-04-07T17:16:50.824213" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.824260" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.791552" elapsed="0.032745"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.880722" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.824844" elapsed="0.056127"/>
</kw>
<msg time="2026-04-07T17:16:50.881202" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:50.881248" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.824461" elapsed="0.056823"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.881688" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.881396" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.881358" elapsed="0.000438"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.882413" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:50.881938" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.882794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.882583" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.882564" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:50.882931" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:50.885409" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.886899" elapsed="0.000519"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:50.888349" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:50.883881" elapsed="0.004871"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:50.883263" elapsed="0.005603"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.789943" elapsed="0.099028"/>
</kw>
<msg time="2026-04-07T17:16:50.889082" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.889126" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.789336" elapsed="0.099827"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:50.889402" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:50.889294" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.889275" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.889882" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.890249" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.890320" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.788639" elapsed="0.101789"/>
</kw>
<msg time="2026-04-07T17:16:50.890525" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:50.890569" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.783913" elapsed="0.106693"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:50.890958" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:50.890686" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.890665" elapsed="0.000494"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:50.783776" elapsed="0.107408"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:50.580757" elapsed="0.310462"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:50.578386" elapsed="0.312895"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:50.573848" elapsed="0.317494"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.573428" elapsed="0.317963"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:50.570402" elapsed="0.321045"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:16:50.895864" 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-07T17:16:50.891687" elapsed="0.004217">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-04-07T17:16:50.569794" elapsed="0.326290">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t28" name="Check Shards Status After Recover" line="139">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:50.899313" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:50.899057" 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-07T17:16:50.900558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.900447" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.900430" 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-07T17:16:50.905182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.905075" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.905057" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.906239" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:50.905837" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:50.906722" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:50.906422" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:50.906790" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:50.906941" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:50.905467" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.913751" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.913644" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.913625" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:50.915057" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:50.914923" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:50.914905" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:50.915656" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:50.915294" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.916100" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:50.915835" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:50.950067" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:50.916657" elapsed="0.033582"/>
</kw>
<msg time="2026-04-07T17:16:50.950406" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:50.950451" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.916280" elapsed="0.034206"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.005399" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:50.951071" elapsed="0.054517"/>
</kw>
<msg time="2026-04-07T17:16:51.005754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:51.005799" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.950649" elapsed="0.055185"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.006157" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.005910" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.005890" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.006762" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.006394" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.007139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.006910" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.006892" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:51.007270" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.009565" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:16:51.011032" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:51.012423" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.008106" elapsed="0.004709"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:51.007527" elapsed="0.005402"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:50.914626" elapsed="0.098418"/>
</kw>
<msg time="2026-04-07T17:16:51.013165" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.013211" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.914019" elapsed="0.099229"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:51.013429" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.013324" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.013306" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.013884" elapsed="0.000058"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.014275" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.014346" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:50.913306" elapsed="0.101145"/>
</kw>
<msg time="2026-04-07T17:16:51.014542" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.014585" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.907382" elapsed="0.107239"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.014936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.014694" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.014678" elapsed="0.000453"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:50.907245" elapsed="0.107909"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.020399" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.020294" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.020276" elapsed="0.000189"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.021653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.021549" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.021531" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.022235" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.021854" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.022653" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:51.022412" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.059924" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:51.023228" elapsed="0.037146"/>
</kw>
<msg time="2026-04-07T17:16:51.060789" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:51.060893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.022831" elapsed="0.038150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.130332" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:51.062430" elapsed="0.068109"/>
</kw>
<msg time="2026-04-07T17:16:51.130711" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:51.130757" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.061433" elapsed="0.069361"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.131141" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.130883" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.130857" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.131791" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.131415" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.132181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.131947" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.131928" elapsed="0.000411"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:51.132375" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.134799" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:16:51.136312" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:51.137726" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.133281" elapsed="0.004858"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:51.132666" elapsed="0.005587"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:51.021227" elapsed="0.117128"/>
</kw>
<msg time="2026-04-07T17:16:51.138451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.138500" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.020610" elapsed="0.117928"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:51.138722" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.138616" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.138598" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.139224" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.139576" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.139647" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:51.019945" elapsed="0.119811"/>
</kw>
<msg time="2026-04-07T17:16:51.139854" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.139899" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.015408" elapsed="0.124530"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.140298" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.140048" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.140029" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:51.015273" elapsed="0.125125"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.145948" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.145842" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.145823" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.147209" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.147103" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.147086" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.147790" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.147414" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.148251" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:51.147969" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.186089" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:51.148807" elapsed="0.037458"/>
</kw>
<msg time="2026-04-07T17:16:51.186434" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:51.186479" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.148431" elapsed="0.038084"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:51.254494" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:51.187145" elapsed="0.067539"/>
</kw>
<msg time="2026-04-07T17:16:51.254857" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:51.254904" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.186717" elapsed="0.068223"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.255268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.255042" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.255021" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.255883" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.255509" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.256266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.256053" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.256034" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:51.256397" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.258697" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:16:51.260159" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:51.261548" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.257228" elapsed="0.004726"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:51.256646" elapsed="0.005437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:51.146789" elapsed="0.115394"/>
</kw>
<msg time="2026-04-07T17:16:51.262274" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.262317" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.146180" elapsed="0.116173"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:51.262535" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.262428" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.262409" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.263010" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.263336" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.263406" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:51.145499" elapsed="0.118013"/>
</kw>
<msg time="2026-04-07T17:16:51.263603" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:51.263646" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:51.140671" elapsed="0.123011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.264032" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.263755" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.263738" elapsed="0.000374"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:51.140535" elapsed="0.123600"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:50.907064" elapsed="0.357132"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:50.904688" elapsed="0.359574"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:50.900150" elapsed="0.364172"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:50.899719" elapsed="0.364651"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:50.897047" elapsed="0.367379"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:16:51.285519" elapsed="0.000237"/>
</kw>
<msg time="2026-04-07T17:16:51.285804" 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-07T17:16:51.284810" 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 [['topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.284361" elapsed="0.001569"/>
</kw>
<msg time="2026-04-07T17:16:51.285992" 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-07T17:16:51.276393" 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-07T17:16:51.276000" elapsed="0.010121"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.286541" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.286292" elapsed="0.000292"/>
</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-07T17:16:51.291540" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.291161" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.292039" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.291721" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:51.292109" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:51.292262" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:51.290775" 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-07T17:16:51.292436" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.293091" 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-07T17:16:51.292743" elapsed="0.000374"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.293505" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.293269" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.293905" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.293673" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.298262" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.297615" elapsed="0.000698"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:51.298372" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:51.298701" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.296277" elapsed="0.002481"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.345156" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.344736" elapsed="0.000485"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.346021" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.345717" elapsed="0.000390">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.346202" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.345385" elapsed="0.000843"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.346771" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.346389" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.347144" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:51.347324" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:51.346955" elapsed="0.000395"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.347746" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.347503" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.348889" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.348634" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.349382" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.349106" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.349720" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.349922" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.350111" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.349589" elapsed="0.000580"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.349455" elapsed="0.000743"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:51.350240" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:51.350396" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:51.348170" elapsed="0.002251"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.347857" elapsed="0.002595"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.350619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.350477" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.347838" elapsed="0.002857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.351305" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.350834" elapsed="0.000498"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.351378" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:51.344128" elapsed="0.007376"/>
</kw>
<msg time="2026-04-07T17:16:51.351556" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.332511" elapsed="0.019095"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.363054" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.374379" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.385665" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.385857" 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-07T17:16:51.386042" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.386406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.386264" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:51.386249" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.386624" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.386793" elapsed="0.000025"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.386968" elapsed="0.000034"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.386221" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.386122" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.387202" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.387277" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:51.387392" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:51.328590" elapsed="0.058827"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.388662" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.388427" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.388813" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.388092" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.389169" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.388907" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.389697" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.389409" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.389251" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.388888" elapsed="0.000891"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.392146" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.389924" elapsed="0.002248"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:51.392222" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:51.392372" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.387732" elapsed="0.004664"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.393624" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.393391" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.393777" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.393061" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:51.394023" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.393871" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.393853" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.394246" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.394413" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.394478" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:51.396248" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.392727" elapsed="0.003548"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.397646" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.397399" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.398095" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.397836" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.413000" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.413663" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:51.414169" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.400118" elapsed="0.014113"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.398205" elapsed="0.016122"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.414721" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.414385" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.398187" elapsed="0.016722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.422217" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.417232" elapsed="0.005191"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.416712" elapsed="0.005746"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.416670" elapsed="0.005813"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.425014" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.422755" elapsed="0.002306"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.422539" elapsed="0.002557"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.422522" elapsed="0.002599"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.425679" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.425277" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.426028" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.425776" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.426564" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.426266" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.426111" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.425757" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.427264" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.426799" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.427604" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.427373" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.428152" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.427837" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.427684" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.427354" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.428377" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.429223" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.428906" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.429400" elapsed="0.002160"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.415714" elapsed="0.015909"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.431796" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.431692" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.431674" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.437625" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.432021" elapsed="0.005634"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.437707" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:51.437864" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.396581" elapsed="0.041309"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.437952" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:16:51.438142" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.307928" elapsed="0.130265"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.438660" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.438358" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.438309" elapsed="0.000529"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.438925" elapsed="0.000082"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:51.303002" elapsed="0.136188"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.298965" elapsed="0.140302"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.298945" elapsed="0.140379"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.440391" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.440192" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:51.440724" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.440509" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.440133" elapsed="0.000737"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.441802" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:16:51.442004" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:51.439583" elapsed="0.002483"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.443309" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.442370" elapsed="0.001001"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.445224" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.443665" elapsed="0.001621"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.452481" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.452230" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.453071" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.452732" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.463399" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.463480" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:51 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":43,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:16:50.373","LastApplied":106,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":106,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.482","active":true,"matchIndex":106,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":107},{"timeSinceLastActivity":"00:00:00.482","active":true,"matchIndex":106,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"836.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":31,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:51.463626" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.455133" elapsed="0.008528"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.453236" elapsed="0.010485"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.463972" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.463757" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.453215" elapsed="0.010940"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.468677" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":43,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:16:50.373","LastApplied":106,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":106,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.482","active":true,"matchIndex":106,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":107},{"timeSinceLastActivity":"00:00:00.482","active":true,"matchIndex":106,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":107}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"836.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":31,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.465648" elapsed="0.003114"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.465346" elapsed="0.003465"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.465320" elapsed="0.003525"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.472251" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.469280" elapsed="0.003034"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.468923" elapsed="0.003438"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.468898" elapsed="0.003497"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.473182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.472610" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.473659" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.473338" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.474425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.474007" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.473772" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.473311" elapsed="0.001230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.475275" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.474752" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.475723" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.475408" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.476477" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.476070" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.475834" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.475383" elapsed="0.001206"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.476788" elapsed="0.000493"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.477911" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.477534" elapsed="0.000412"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.478179" elapsed="0.002264"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.464715" elapsed="0.015789"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.480731" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.480624" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.480604" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.483692" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.481007" elapsed="0.002714"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.483854" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:16:51.484221" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.447405" elapsed="0.036866"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.484343" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:51.484667" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.445639" elapsed="0.039087"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.486890" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.486094" elapsed="0.000847"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:51.487024" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:51.487381" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:51.485169" elapsed="0.002272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.488111" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 106, 'CommittedTransactionsCount': 31, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.487730" elapsed="0.000442"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.488889" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.488504" elapsed="0.000443"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:51.489185" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:51.489340" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:51.295331" elapsed="0.194033"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:51.489420" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:51.489578" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:51.294534" elapsed="0.195068"/>
</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-07T17:16:51.490059" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.489679" elapsed="0.000440"/>
</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="PASS" start="2026-04-07T17:16:51.490353" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.490144" elapsed="0.000481"/>
</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-07T17:16:51.490793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.490650" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.489662" elapsed="0.001207"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:51.294366" elapsed="0.196526"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.494930" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.494326" elapsed="0.000738"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:51.495128" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:51.495450" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.492952" elapsed="0.002556"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.542023" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.541627" elapsed="0.000459"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.542826" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.542613" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.543003" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.542248" elapsed="0.000781"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.543577" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.543196" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.543894" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:51.544039" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:51.543758" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.544460" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.544216" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.545477" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.545227" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.545931" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.545673" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.546292" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.546491" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.546675" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.546166" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.546022" elapsed="0.000738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:51.546801" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:51.546955" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:51.544890" elapsed="0.002106"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.544596" elapsed="0.002432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.547194" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.547053" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.544572" elapsed="0.002698"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.547822" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.547405" elapsed="0.000443"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.547895" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:51.541019" elapsed="0.007016"/>
</kw>
<msg time="2026-04-07T17:16:51.548087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.529325" elapsed="0.018815"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.559453" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.570783" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.586888" elapsed="0.000110"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.587351" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.587614" elapsed="0.000030"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.588260" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.588051" elapsed="0.000289"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:51.588023" elapsed="0.000355"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.588571" elapsed="0.000029"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.588796" elapsed="0.000029"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.589043" elapsed="0.000030"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.587945" elapsed="0.001174"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.587740" elapsed="0.001417"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.589357" elapsed="0.000029"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.589467" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:51.589679" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:51.525422" elapsed="0.064295"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.591762" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.591313" elapsed="0.000557">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.592024" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.590725" elapsed="0.001334"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.592516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.592160" elapsed="0.000414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.593091" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.592777" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.592598" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.592133" elapsed="0.001042"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.595394" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.593321" elapsed="0.002109"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:51.595480" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:16:51.595648" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.590238" elapsed="0.005434"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.596957" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.596721" elapsed="0.000315">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.597130" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.596387" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:51.597360" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.597224" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.597206" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.597585" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.597762" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.597827" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:51.599604" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.596065" elapsed="0.003566"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.601048" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.600772" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.601482" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.601240" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.657288" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.657877" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:51.658200" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.605068" elapsed="0.053169"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.601590" elapsed="0.056706"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.658545" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.658332" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.601571" elapsed="0.057094"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.663628" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.660099" elapsed="0.003808"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.659769" elapsed="0.004187"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.659737" elapsed="0.004275"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.667413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.664399" elapsed="0.003078"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.664092" elapsed="0.003433"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.664069" elapsed="0.003490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.668347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.667776" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.668837" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.668480" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.669586" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.669197" elapsed="0.000421"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.668954" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.668455" elapsed="0.001221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.670205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.669828" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.670531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.670301" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.671109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.670769" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.670612" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.670283" elapsed="0.000968"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.671403" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.672245" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.671919" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.672421" elapsed="0.002160"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.659169" elapsed="0.015474"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.674816" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.674712" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.674693" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.680533" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.675045" elapsed="0.005517"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.680614" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:51.680771" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.599949" elapsed="0.080848"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.680858" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:51.681090" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.504644" elapsed="0.176500"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.681625" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.681318" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.681266" elapsed="0.000532"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.681889" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:51.499730" elapsed="0.182432"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.495713" elapsed="0.186529"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.495694" elapsed="0.186607"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.683421" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.683213" elapsed="0.000292"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:51.683741" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.683542" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.683152" elapsed="0.000734"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.684853" elapsed="0.000058"/>
</kw>
<msg time="2026-04-07T17:16:51.685084" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:51.682562" elapsed="0.002583"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.686430" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.685457" elapsed="0.001035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.688225" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.686795" elapsed="0.001492"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.695692" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.695434" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.696352" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.695940" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.706393" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.706451" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:51 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":106,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":106,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"581.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:51.706559" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.698425" elapsed="0.008159"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.696515" elapsed="0.010111"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.706801" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.706652" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.696494" elapsed="0.010393"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.710201" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":106,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":106,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"581.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.707976" elapsed="0.002284"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.707726" elapsed="0.002569"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.707708" elapsed="0.002613"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.713648" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.710644" elapsed="0.003068"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.710377" elapsed="0.003382"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.710360" elapsed="0.003433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.714550" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.714033" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.715027" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.714686" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.715779" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.715364" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.715143" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.714661" elapsed="0.001233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.716635" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.716130" elapsed="0.000541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.717107" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.716767" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.717876" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.717434" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.717222" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.716742" elapsed="0.001293"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.718243" elapsed="0.000419"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.719111" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.718821" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.719286" elapsed="0.002127"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.707310" elapsed="0.014165"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.722541" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.722334" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.721577" elapsed="0.001051"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.725828" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.722879" elapsed="0.002979"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.725967" elapsed="0.000083"/>
</return>
<msg time="2026-04-07T17:16:51.726370" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.690451" elapsed="0.036034"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.726566" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:51.726908" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.688643" elapsed="0.038330"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.729283" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.728420" elapsed="0.000916"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:51.729400" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:51.729794" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:51.727459" elapsed="0.002406"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.730564" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 106, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.730196" elapsed="0.000431"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.731437" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.730970" elapsed="0.000528"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:51.731727" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:51.731885" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:51.492080" elapsed="0.239830"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:51.731972" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:51.732137" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:51.491316" elapsed="0.240846"/>
</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="PASS" start="2026-04-07T17:16:51.732461" elapsed="0.000233"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.732245" elapsed="0.000487"/>
</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-07T17:16:51.732899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.732756" 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-07T17:16:51.733135" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.732980" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.732227" elapsed="0.000982"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:51.491153" elapsed="0.242081"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.737623" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.737004" elapsed="0.000670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:51.737733" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:51.738107" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.735611" elapsed="0.002554"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.784741" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.784363" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.785511" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.785274" elapsed="0.000308">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.785717" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.784928" elapsed="0.000814"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.786309" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.785904" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.786628" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:51.786787" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:51.786493" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.787230" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.786967" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.788360" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.788106" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.788821" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.788561" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.789180" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.789380" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.789547" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.789050" elapsed="0.000553"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.788898" elapsed="0.000734"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:51.789677" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:51.789833" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:51.787627" elapsed="0.002231"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.787341" elapsed="0.002548"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.790070" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.789913" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.787321" elapsed="0.002826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.790708" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.790283" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.790782" elapsed="0.000042"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:51.783743" elapsed="0.007180"/>
</kw>
<msg time="2026-04-07T17:16:51.790975" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.772017" elapsed="0.019027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.802339" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.813611" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.824923" 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-07T17:16:51.825127" 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-07T17:16:51.825297" 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-07T17:16:51.825651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.825513" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:51.825498" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.825864" 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-07T17:16:51.826043" 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-07T17:16:51.826206" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:51.825470" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.825370" elapsed="0.000914"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.826424" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.826498" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:51.826612" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:51.768087" elapsed="0.058550"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.827891" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.827648" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.828065" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.827287" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.828399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.828160" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.828926" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.828638" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.828478" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.828141" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.831302" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.829171" elapsed="0.002157"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:51.831378" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:51.831547" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.826953" elapsed="0.004619"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:51.832768" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:51.832529" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:51.832964" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:51.832205" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:51.833216" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.833080" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.833061" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.833437" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.833600" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.833663" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:51.835414" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:51.831870" elapsed="0.003569"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.836820" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.836576" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.837267" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.837025" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.871385" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.871801" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:51.872035" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.839391" elapsed="0.032672"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.837376" elapsed="0.034730"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.872304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.872132" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.837357" elapsed="0.035033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.876016" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.873393" elapsed="0.002825"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.873176" elapsed="0.003077"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.873156" elapsed="0.003122"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.878670" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.876570" elapsed="0.002145"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.876351" elapsed="0.002398"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.876334" elapsed="0.002440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.879324" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.878928" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.879648" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.879420" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.880196" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.879880" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.879728" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.879402" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.880815" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.880456" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.881157" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.880910" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.881677" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.881389" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.881238" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.880892" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.881898" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.882688" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.882415" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.882953" elapsed="0.002151"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.872736" elapsed="0.012431"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.885346" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.885236" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.885217" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.891013" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.885552" elapsed="0.005491"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.891094" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:51.891249" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.835763" elapsed="0.055512"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.891336" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:51.891509" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.747449" elapsed="0.144113"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.892047" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.891725" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.891676" elapsed="0.000542"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.892305" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:51.742438" elapsed="0.150106"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.738378" elapsed="0.154261"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.738358" elapsed="0.154340"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.893765" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.893565" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:51.894095" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:16:51.893880" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.893506" elapsed="0.000734"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.895176" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:16:51.895360" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:51.892958" elapsed="0.002461"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.896690" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.895727" elapsed="0.001027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.898392" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.897079" elapsed="0.001376"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.905766" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.905517" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.906274" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.906029" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:51.916203" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:51.916260" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:51 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:51 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Follower","LastApplied":106,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":106,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"383.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:51.916362" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:51.908467" elapsed="0.007920"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.906436" elapsed="0.009993"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.916609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.916455" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.906415" elapsed="0.010277"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.919947" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":105,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":105,"Leader":"member-1-shard-topology-operational","LastIndex":106,"RaftState":"Follower","LastApplied":106,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":106,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"383.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":106,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":34168},"timestamp":1775582211,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.917790" elapsed="0.002233"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.917543" elapsed="0.002515"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.917525" elapsed="0.002557"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.922470" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:51.920353" elapsed="0.002161"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.920137" elapsed="0.002416"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.920120" elapsed="0.002457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.923117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.922731" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.923457" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.923213" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.924013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.923690" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.923538" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.923195" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.924608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.924249" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.924926" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.924702" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.925502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.925209" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.925026" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.924684" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.925732" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:51.926519" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.926250" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.926696" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:51.917128" elapsed="0.011743"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:51.929124" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:51.929015" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.928975" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:51.931968" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:51.929399" elapsed="0.002611"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:51.932111" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:16:51.932453" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:51.900580" elapsed="0.031952"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:51.932605" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:51.932928" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.898810" elapsed="0.034194"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.935138" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:51.934349" elapsed="0.000841"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:51.935253" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:51.935600" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:51.933458" elapsed="0.002203"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.936315" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 106, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.935947" elapsed="0.000429"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:51.937106" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.936705" elapsed="0.000460"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:51.937402" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:51.937562" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:51.734636" elapsed="0.202950"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:51.937642" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:51.937786" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:51.733576" elapsed="0.204234"/>
</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="PASS" start="2026-04-07T17:16:51.938121" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.937888" elapsed="0.000493"/>
</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-07T17:16:51.938544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.938405" 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-07T17:16:51.938755" elapsed="0.000169"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.938621" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.937870" elapsed="0.001131"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:51.733404" elapsed="0.205625"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:51.293991" elapsed="0.645068"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:51.939101" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:51.939304" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:51.939350" level="INFO">${follower_list} = [2, 3]</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-07T17:16:51.290043" elapsed="0.649330"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.939819" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:51.939894" level="INFO">${leader_count} = 1</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-07T17:16:51.939545" elapsed="0.000372"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:51.940216" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:51.940004" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.939973" elapsed="0.000320"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.942314" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:51.940424" elapsed="0.001936"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:51.942752" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:51.942563" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:51.942824" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:16:51.287561" elapsed="0.655435"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:16:51.287343" elapsed="0.655702"/>
</iter>
<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-07T17:16:51.947368" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:51.946979" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.947920" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.947547" elapsed="0.000399"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:51.948012" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:51.948167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:51.946610" elapsed="0.001581"/>
</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-07T17:16:51.948339" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.948978" 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-07T17:16:51.948647" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.949407" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.949171" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.949832" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:51.949597" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:51.953920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:51.953295" elapsed="0.000676"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:51.954052" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:51.954379" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:51.951923" elapsed="0.002515"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.001718" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.001340" elapsed="0.000406"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.002462" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.002248" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.002629" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.001902" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.003207" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.002810" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.003519" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:52.003645" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:52.003387" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.004122" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.003857" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.005104" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.004835" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.005565" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.005301" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.005893" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.006108" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.006276" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.005767" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.005636" elapsed="0.000725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:52.006402" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.006561" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:52.004519" elapsed="0.002089"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.004235" elapsed="0.002404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.006806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.006663" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.004216" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.007455" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.007034" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.007528" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.000725" elapsed="0.006925"/>
</kw>
<msg time="2026-04-07T17:16:52.007700" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:51.989229" elapsed="0.018523"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.019163" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.030497" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.041752" 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-07T17:16:52.041938" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.042128" 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-07T17:16:52.042482" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.042344" elapsed="0.000229"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:52.042329" elapsed="0.000268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.042735" 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-07T17:16:52.042897" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.043076" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.042301" elapsed="0.000830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.042203" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.043311" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.043386" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.043500" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:51.985202" elapsed="0.058324"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.044738" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.044504" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.044890" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.044174" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.045248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.045006" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.045769" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.045483" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.045328" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.044969" elapsed="0.000881"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.048343" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.046010" elapsed="0.002373"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:52.048442" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:16:52.048605" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.043834" elapsed="0.004796"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.049883" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.049628" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.050054" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.049287" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:52.050285" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.050150" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.050131" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.050505" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.050668" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.050733" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.052755" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.048933" elapsed="0.003848"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.054193" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.053928" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.054619" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.054382" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.068224" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.068624" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:52.068817" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.056645" elapsed="0.012198"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.054726" elapsed="0.014159"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.069081" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.068911" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.054708" elapsed="0.014460"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.072665" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.070160" elapsed="0.002708"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.069921" elapsed="0.002982"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.069902" elapsed="0.003026"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.075311" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.073218" elapsed="0.002137"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.073000" elapsed="0.002389"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.072969" elapsed="0.002444"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.075959" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.075566" elapsed="0.000437"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.076304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.076075" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.076832" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.076538" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.076385" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.076056" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.077439" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.077081" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.077759" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.077535" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.078297" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.078006" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.077839" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.077516" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.078519" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.079308" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.079035" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.079480" elapsed="0.002124"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.069504" elapsed="0.012161"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.081837" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.081734" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.081715" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.087722" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.082061" elapsed="0.005691"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.087803" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:52.087958" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.053140" elapsed="0.034871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.088074" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:52.088248" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:51.963808" elapsed="0.124489"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.088759" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.088462" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.088412" elapsed="0.000524"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.089047" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:51.958845" elapsed="0.130443"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:51.954653" elapsed="0.134712"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:51.954634" elapsed="0.134787"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.090485" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.090285" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:52.090795" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.090602" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.090226" elapsed="0.000711"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.091863" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:16:52.092085" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:52.089678" elapsed="0.002468"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.093389" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.092448" elapsed="0.001004"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.095176" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.093748" elapsed="0.001489"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.102395" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.101967" elapsed="0.000473"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.102888" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.102646" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.111539" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.111596" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:52 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":46,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":46,"Leader":"member-1-shard-default-operational","LastIndex":49,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":48,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":49,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":46,"voting":true,"id":"member-3-shard-default-operational","nextIndex":47},{"timeSinceLastActivity":"00:00:00.083","active":true,"matchIndex":48,"voting":true,"id":"member-2-shard-default-operational","nextIndex":49}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"464.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":48,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49687},"timestamp":1775582212,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:52.111699" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.104940" elapsed="0.006785"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.103064" elapsed="0.008703"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.111941" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.111792" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.103042" elapsed="0.009033"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.116387" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":46,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":46,"Leader":"member-1-shard-default-operational","LastIndex":49,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":48,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":49,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":46,"voting":true,"id":"member-3-shard-default-operational","nextIndex":47},{"timeSinceLastActivity":"00:00:00.083","active":true,"matchIndex":48,"voting":true,"id":"member-2-shard-default-operational","nextIndex":49}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"464.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":48,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49687},"timestamp":1775582212,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.113141" elapsed="0.003335"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.112910" elapsed="0.003601"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.112891" elapsed="0.003645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.118925" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.116810" elapsed="0.002163"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.116592" elapsed="0.002434"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.116575" elapsed="0.002476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.119573" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.119205" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.119900" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.119671" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.120456" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.120157" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.119999" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.119652" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.121086" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.120706" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.121408" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.121183" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.121936" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.121641" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.121488" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.121164" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.122179" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.122945" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.122677" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.123137" elapsed="0.002134"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.112492" elapsed="0.012840"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.125560" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.125453" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.125433" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.128520" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.125812" elapsed="0.002736"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.128694" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:16:52.129062" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.097375" elapsed="0.031737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.129184" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:52.129509" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.095589" elapsed="0.033979"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.131700" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.130879" elapsed="0.000873"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:52.131814" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:52.132189" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:52.130007" elapsed="0.002244"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.132926" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 48, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.132538" elapsed="0.000467"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.133721" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.133333" elapsed="0.000447"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:52.134016" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:52.134170" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:51.951046" elapsed="0.183148"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:52.134249" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:52.134391" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:51.950282" elapsed="0.184133"/>
</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-07T17:16:52.134698" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.134491" elapsed="0.000263"/>
</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="PASS" start="2026-04-07T17:16:52.134994" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.134778" elapsed="0.000478"/>
</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-07T17:16:52.135420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.135281" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.134474" elapsed="0.001020"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:51.950119" elapsed="0.185398"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.139527" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.138910" elapsed="0.000667"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:52.139638" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:52.139960" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:52.137576" elapsed="0.002523"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.186648" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.186250" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.187446" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.187237" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.187610" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.186888" elapsed="0.000746"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.188190" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.187790" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.188503" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:52.188629" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:52.188370" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.189059" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.188803" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.190060" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.189792" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.190514" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.190256" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.190842" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.191055" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.191223" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.190716" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.190585" elapsed="0.000722"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:52.191349" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.191504" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:52.189450" elapsed="0.002080"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.189170" elapsed="0.002391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.191726" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.191586" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.189151" elapsed="0.002650"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.192371" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.191937" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.192445" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.185634" elapsed="0.006931"/>
</kw>
<msg time="2026-04-07T17:16:52.192618" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.174102" elapsed="0.018566"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.204254" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.215625" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.226930" 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-07T17:16:52.227131" 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-07T17:16:52.227301" 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-07T17:16:52.227654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.227517" elapsed="0.000191"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:52.227502" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.227865" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.228042" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.228204" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.227474" elapsed="0.000782"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.227375" elapsed="0.000906"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.228419" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.228493" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.228606" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:52.170163" elapsed="0.058472"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.229845" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.229613" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.230014" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.229280" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.230380" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.230110" elapsed="0.000327"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.230902" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.230615" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.230461" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.230091" elapsed="0.000910"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.233164" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.231148" elapsed="0.002042"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:52.233240" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:52.233391" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.228945" elapsed="0.004470"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.234656" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.234422" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.234809" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.234077" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:52.235057" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.234904" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.234885" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.235281" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.235445" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.235510" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.237410" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.233743" elapsed="0.003694"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.238811" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.238566" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.239260" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.239018" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.261549" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.261951" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:52.262186" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.241264" elapsed="0.020949"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.239370" elapsed="0.022886"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.262430" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.262282" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.239351" elapsed="0.023164"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.266027" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.263527" elapsed="0.002714"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.263313" elapsed="0.002963"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.263294" elapsed="0.003008"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.268695" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.266578" elapsed="0.002162"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.266358" elapsed="0.002416"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.266341" elapsed="0.002457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.269339" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.268952" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.269670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.269436" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.270219" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.269903" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.269750" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.269417" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.270838" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.270455" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.271182" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.270935" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.271848" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.271415" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.271263" elapsed="0.000646"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.270917" elapsed="0.001014"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.272098" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.272878" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.272601" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.273068" elapsed="0.002127"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.262871" elapsed="0.012386"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.275429" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.275325" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.275307" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.281160" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.275640" elapsed="0.005549"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.281241" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:52.281397" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.237729" elapsed="0.043694"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.281484" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:52.281655" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.149426" elapsed="0.132278"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.282194" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.281869" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.281820" elapsed="0.000543"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.282449" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:52.144483" elapsed="0.138203"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.140307" elapsed="0.142454"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.140287" elapsed="0.142530"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.283889" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.283690" elapsed="0.000283"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:52.284222" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.284026" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.283630" elapsed="0.000733"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.285329" elapsed="0.000058"/>
</kw>
<msg time="2026-04-07T17:16:52.285521" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:52.283103" elapsed="0.002477"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.286818" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.285887" elapsed="0.000992"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.288527" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.287227" elapsed="0.001361"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.295707" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.295460" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.296211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.295949" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.306092" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.306149" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:52 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":46,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":46,"Leader":"member-1-shard-default-operational","LastIndex":48,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":48,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":48,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"314.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":48,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49646},"timestamp":1775582212,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:52.306250" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.298257" elapsed="0.008018"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.296371" elapsed="0.009946"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.306491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.306343" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.296350" elapsed="0.010226"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.310024" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":46,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":46,"Leader":"member-1-shard-default-operational","LastIndex":48,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":48,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":48,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"314.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":48,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49646},"timestamp":1775582212,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.307703" elapsed="0.002382"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.307452" elapsed="0.002670"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.307433" elapsed="0.002713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.312565" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.310420" elapsed="0.002191"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.310203" elapsed="0.002443"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.310185" elapsed="0.002485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.313220" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.312827" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.313553" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.313319" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.314112" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.313793" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.313640" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.313300" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.314708" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.314348" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.315047" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.314805" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.315589" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.315283" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.315130" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.314787" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.315815" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.316603" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.316334" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.316781" elapsed="0.002103"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.307015" elapsed="0.011931"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.319191" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.319084" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.319063" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.322075" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.319445" elapsed="0.002659"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.322204" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:16:52.322547" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.290685" elapsed="0.031911"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.322701" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:52.323045" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.288937" elapsed="0.034168"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.325230" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.324432" elapsed="0.000850"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:52.325343" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:52.325693" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:52.323530" elapsed="0.002224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.326418" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 48, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.326062" elapsed="0.000416"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.327211" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.326804" elapsed="0.000466"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:52.327488" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:52.327646" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:52.136676" elapsed="0.191020"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:52.327753" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:52.327899" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:52.135831" elapsed="0.192091"/>
</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="PASS" start="2026-04-07T17:16:52.328227" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.328017" elapsed="0.000472"/>
</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-07T17:16:52.328653" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.328514" 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-07T17:16:52.328864" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.328730" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.327998" elapsed="0.000938"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:52.135670" elapsed="0.193289"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.333013" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.332388" elapsed="0.000677"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:52.333124" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:52.333445" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:52.331046" elapsed="0.002457"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.379773" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.379396" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.380654" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.380304" elapsed="0.000432">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.380895" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.379956" elapsed="0.000964"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.381508" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.381109" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.381824" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:52.381950" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:52.381690" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.382389" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.382146" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.383372" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.383120" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.383825" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.383568" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.384183" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.384381" elapsed="0.000031"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.384576" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.384054" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.383905" elapsed="0.000758"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:52.384705" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.384860" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:52.382788" elapsed="0.002097"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.382500" elapsed="0.002416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.385099" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.384941" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.382481" elapsed="0.002695"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.385727" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.385312" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.385801" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.378782" elapsed="0.007137"/>
</kw>
<msg time="2026-04-07T17:16:52.385974" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.367165" elapsed="0.018875"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.397438" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.408762" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.420066" 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-07T17:16:52.420253" 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-07T17:16:52.420424" 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-07T17:16:52.420775" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.420637" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:52.420623" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.421002" 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-07T17:16:52.421179" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.421340" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.420595" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.420498" elapsed="0.000919"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.421554" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.421628" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:52.421741" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:52.363268" elapsed="0.058498"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.423019" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.422759" elapsed="0.000324">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.423174" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.422420" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.423508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.423269" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.424050" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.423743" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.423588" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.423250" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.426306" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.424278" elapsed="0.002054"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:52.426383" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:52.426533" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.422092" elapsed="0.004465"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.427742" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.427510" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.427929" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.427182" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:52.428181" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.428044" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.428025" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.428401" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.428566" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.428631" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.430524" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.426847" elapsed="0.003703"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.431896" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.431654" elapsed="0.000286"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.432344" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.432105" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.452428" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.452819" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:52.453043" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.434369" elapsed="0.018701"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.432453" elapsed="0.020660"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.453289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.453139" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.432435" elapsed="0.020939"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.456848" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.454374" elapsed="0.002693"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.454158" elapsed="0.002945"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.454138" elapsed="0.002990"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.459509" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.457400" elapsed="0.002153"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.457184" elapsed="0.002403"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.457167" elapsed="0.002443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.460146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.459763" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.460468" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.460242" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.461013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.460701" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.460549" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.460223" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.461605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.461249" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.461956" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.461726" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.462505" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.462214" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.462059" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.461682" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.462728" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.463510" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.463242" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.463682" elapsed="0.002132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.453724" elapsed="0.012152"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.466067" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.465945" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.465926" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.471996" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.466272" elapsed="0.005755"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.472079" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:52.472234" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.430845" elapsed="0.041415"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.472321" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:52.472491" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.342906" elapsed="0.129634"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.473020" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.472703" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.472655" elapsed="0.000534"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.473276" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:52.337929" elapsed="0.135584"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.333710" elapsed="0.139878"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.333690" elapsed="0.139955"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.474720" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.474517" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:16:52.475044" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.474835" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.474459" elapsed="0.000728"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.476093" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:16:52.476277" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:52.473915" elapsed="0.002421"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.477578" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.476634" elapsed="0.001005"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.479294" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.477937" elapsed="0.001417"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.486604" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.486354" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.487109" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.486847" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.496116" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.496173" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:52 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-operational","LastIndex":46,"RaftState":"Follower","LastApplied":46,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"313.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49564},"timestamp":1775582212,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:52.496276" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.489243" elapsed="0.007059"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.487268" elapsed="0.009076"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.496516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.496369" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.487248" elapsed="0.009353"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.500019" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-operational","LastIndex":46,"RaftState":"Follower","LastApplied":46,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":46,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"313.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":46,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":49564},"timestamp":1775582212,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.497682" elapsed="0.002398"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.497427" elapsed="0.002688"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.497409" elapsed="0.002731"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.502536" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.500411" elapsed="0.002169"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.500196" elapsed="0.002418"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.500178" elapsed="0.002461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.503188" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.502799" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.503513" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.503286" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.504063" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.503747" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.503595" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.503267" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.504657" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.504297" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.504996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.504753" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.505522" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.505231" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.505078" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.504734" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.505751" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.506551" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.506267" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.506725" elapsed="0.002096"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.497010" elapsed="0.011873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.509136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.509028" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.509006" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.512099" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.509390" elapsed="0.002738"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.512229" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:52.512577" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.481465" elapsed="0.031162"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.512737" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:52.513084" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.479703" elapsed="0.033441"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.515286" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.514474" elapsed="0.000864"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:52.515400" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:52.515759" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558221...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:52.513572" elapsed="0.002247"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.516484" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 46, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.516127" elapsed="0.000419"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.517277" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.516872" elapsed="0.000464"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:52.517559" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:52.517717" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:52.330158" elapsed="0.187583"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:52.517797" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:52.517941" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:52.329293" elapsed="0.188675"/>
</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="PASS" start="2026-04-07T17:16:52.518275" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.518067" elapsed="0.000467"/>
</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-07T17:16:52.518728" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.518558" 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-07T17:16:52.518942" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.518809" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.518049" elapsed="0.000985"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:52.329131" elapsed="0.189926"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:51.949904" elapsed="0.569182"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:52.519125" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:52.519322" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:52.519367" level="INFO">${follower_list} = [2, 3]</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-07T17:16:51.945800" elapsed="0.573590"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.519819" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:52.519893" level="INFO">${leader_count} = 1</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-07T17:16:52.519556" elapsed="0.000360"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.520210" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.520001" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.519970" elapsed="0.000315"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.522336" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:52.520412" elapsed="0.001970"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:52.522774" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.522574" elapsed="0.000225"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:52.522846" 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="PASS" start="2026-04-07T17:16:51.943348" elapsed="0.579748"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:16:51.943131" elapsed="0.580013"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:16:51.287210" elapsed="1.235965"/>
</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="PASS" start="2026-04-07T17:16:51.286804" elapsed="1.236426"/>
</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-07T17:16:52.528214" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.527820" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.528694" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:52.528394" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:52.528763" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:52.528914" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.527457" elapsed="0.001481"/>
</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-07T17:16:52.529103" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.529735" 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-07T17:16:52.529410" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.530166" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:52.529912" elapsed="0.000279"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.530564" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:52.530332" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.534598" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.534000" elapsed="0.000648"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:52.534707" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:16:52.535080" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:52.532651" elapsed="0.002487"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.582415" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.582036" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.583169" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.582932" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.583324" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.582601" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.583915" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.583505" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.584253" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:52.584419" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:52.584117" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.584840" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.584597" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.585820" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.585567" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.586295" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.586035" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.586622" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.586819" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.587002" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.586496" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.586367" elapsed="0.000724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:52.587132" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.587287" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:52.585253" elapsed="0.002059"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.584951" elapsed="0.002392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.587508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.587367" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.584932" elapsed="0.002652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.588180" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.587740" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.588255" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.581420" elapsed="0.006957"/>
</kw>
<msg time="2026-04-07T17:16:52.588428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.569836" elapsed="0.018643"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.649412" elapsed="0.000092"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.660975" elapsed="0.000041"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.672273" 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-07T17:16:52.672595" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.672786" 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-07T17:16:52.673279" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.673123" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:52.673101" elapsed="0.000267"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.673508" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.673672" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.673838" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.673050" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.672877" elapsed="0.001044"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.674082" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.674163" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:16:52.674343" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:52.565922" elapsed="0.108450"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.676126" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.675783" elapsed="0.000427">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.676305" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.675288" elapsed="0.001042"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.676671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.676403" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.677265" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.676933" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.676758" elapsed="0.000568"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.676383" elapsed="0.000965"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.679516" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.677495" elapsed="0.002048"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:52.679593" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:16:52.679749" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.674695" elapsed="0.005078"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.681023" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.680769" elapsed="0.000344">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.681208" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.680430" elapsed="0.000802"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:52.681436" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.681302" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.681283" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.681661" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.681865" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.681932" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.683829" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.680087" elapsed="0.003768"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.685294" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.685013" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.685739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.685489" elapsed="0.000294"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.697869" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.698330" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:52.698547" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.687749" elapsed="0.010825"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.685850" elapsed="0.012767"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.698794" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.698643" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.685831" elapsed="0.013048"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.702413" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.699878" elapsed="0.002742"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.699657" elapsed="0.002999"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.699638" elapsed="0.003043"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.705077" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.702954" elapsed="0.002169"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.702737" elapsed="0.002420"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.702719" elapsed="0.002462"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.705773" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.705337" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.706119" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.705870" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.706654" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.706355" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.706202" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.705852" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.707272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.706887" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.707592" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.707367" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.708135" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.707824" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.707672" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.707349" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.708361" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.709173" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.708857" elapsed="0.000342"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.709347" elapsed="0.002458"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.699238" elapsed="0.012634"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.712065" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.711942" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.711923" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.717865" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.712283" elapsed="0.005611"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.717946" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:16:52.718120" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.684176" elapsed="0.033970"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.718207" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:52.718417" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.545374" elapsed="0.173096"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.718944" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.718642" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.718592" elapsed="0.000564"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.719248" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:52.540407" elapsed="0.179089"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.535347" elapsed="0.184231"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.535327" elapsed="0.184311"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:52.720730" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.720522" elapsed="0.000318"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.721001" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.720878" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.720461" elapsed="0.000658"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.722105" elapsed="0.000059"/>
</kw>
<msg time="2026-04-07T17:16:52.722294" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:52.719896" elapsed="0.002459"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.723621" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.722662" elapsed="0.001029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.725363" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.724034" elapsed="0.001393"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.732593" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.732343" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.733103" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.732842" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.740788" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.740845" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:52 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":21,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":21,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.199","active":true,"matchIndex":21,"voting":true,"id":"member-2-shard-topology-config","nextIndex":22},{"timeSinceLastActivity":"00:00:00.200","active":true,"matchIndex":21,"voting":true,"id":"member-3-shard-topology-config","nextIndex":22}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"441.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582212,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:52.740948" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.735164" elapsed="0.005813"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.733262" elapsed="0.007772"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.741208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.741060" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.733242" elapsed="0.008050"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.744698" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":5,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":21,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":21,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.199","active":true,"matchIndex":21,"voting":true,"id":"member-2-shard-topology-config","nextIndex":22},{"timeSinceLastActivity":"00:00:00.200","active":true,"matchIndex":21,"voting":true,"id":"member-3-shard-topology-config","nextIndex":22}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"441.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":6,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582212,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.742392" elapsed="0.002367"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.742177" elapsed="0.002617"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.742158" elapsed="0.002662"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.747245" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.745110" elapsed="0.002180"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.744876" elapsed="0.002448"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.744859" elapsed="0.002489"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.747872" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.747502" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.748215" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.747972" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.748745" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.748449" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.748297" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.747950" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.749359" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.748999" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.749679" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.749454" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.750239" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.749910" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.749759" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.749436" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.750464" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.751251" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.750964" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.751425" elapsed="0.002103"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.741724" elapsed="0.011865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.753819" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.753713" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.753692" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.756802" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.754097" elapsed="0.002734"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.756932" elapsed="0.000072"/>
</return>
<msg time="2026-04-07T17:16:52.757337" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.727574" elapsed="0.029814"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.757461" elapsed="0.000059"/>
</return>
<msg time="2026-04-07T17:16:52.757788" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.725803" elapsed="0.032045"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.760029" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582212, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.759212" elapsed="0.000870"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:52.760144" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:52.760499" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582212, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:52.758313" elapsed="0.002247"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.761236" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 21, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.760852" elapsed="0.000446"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.762035" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.761625" elapsed="0.000470"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:52.762342" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:52.762501" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:52.531762" elapsed="0.230763"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:52.762582" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:52.762729" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:52.531021" elapsed="0.231731"/>
</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-07T17:16:52.763059" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.762831" elapsed="0.000286"/>
</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="PASS" start="2026-04-07T17:16:52.763343" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.763141" elapsed="0.000466"/>
</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-07T17:16:52.763772" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.763632" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.762814" elapsed="0.001032"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:52.530843" elapsed="0.233027"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.768230" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.767394" elapsed="0.000887"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:52.768340" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:52.768665" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:52.765925" elapsed="0.002798"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.814921" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.814540" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.815712" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.815501" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.815866" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.815135" elapsed="0.000755"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.816445" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.816066" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.816761" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:52.816916" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:52.816624" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.817351" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.817109" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.818327" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.818076" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.818790" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.818523" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.819147" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.819380" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.819547" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.819017" elapsed="0.000586"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.818864" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:52.819673" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.819828" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:52.817745" elapsed="0.002107"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.817461" elapsed="0.002423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.820065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.819908" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.817442" elapsed="0.002700"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.820709" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.820277" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.820782" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:52.813927" elapsed="0.006976"/>
</kw>
<msg time="2026-04-07T17:16:52.820955" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.802481" elapsed="0.018543"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.832473" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.843859" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.855173" 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-07T17:16:52.855361" 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-07T17:16:52.855530" 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-07T17:16:52.855907" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.855760" elapsed="0.000203"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:52.855731" elapsed="0.000272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.856140" 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-07T17:16:52.856302" 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-07T17:16:52.856463" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:52.855702" elapsed="0.000814"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.855604" elapsed="0.000937"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.856679" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.856753" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:52.856867" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:52.798455" elapsed="0.058437"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.858113" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.857864" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.858264" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.857534" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.858595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.858358" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.859136" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.858828" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.858675" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.858339" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.861391" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:52.859360" elapsed="0.002057"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:52.861467" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:52.861617" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.857218" elapsed="0.004423"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:52.862867" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:52.862630" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:52.863036" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:52.862302" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:52.863266" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.863132" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.863114" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.863490" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.863653" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.863719" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:52.865610" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:52.861931" elapsed="0.003705"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.867003" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.866743" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.867435" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.867196" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.887036" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.887426" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:52.887624" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.869451" elapsed="0.018199"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.867544" elapsed="0.020148"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.887869" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.887717" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.867525" elapsed="0.020429"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.891462" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.888968" elapsed="0.002721"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.888753" elapsed="0.002972"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.888734" elapsed="0.003016"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.894146" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.892042" elapsed="0.002149"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.891806" elapsed="0.002418"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.891789" elapsed="0.002459"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.894764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.894400" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.895103" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.894859" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.895634" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.895339" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.895186" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.894841" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.896245" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.895866" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.896603" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.896340" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.897159" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.896848" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.896689" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.896322" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.897383" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.898169" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.897880" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.898343" elapsed="0.002124"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.888339" elapsed="0.012193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.900713" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.900600" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.900582" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.906512" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.900917" elapsed="0.005624"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.906591" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:52.906751" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.865936" elapsed="0.040840"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.906837" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:52.907030" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.777811" elapsed="0.129271"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.907544" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.907248" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.907198" elapsed="0.000515"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.907800" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:52.772938" elapsed="0.135120"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.768935" elapsed="0.139200"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.768915" elapsed="0.139277"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:52.909267" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:52.909067" elapsed="0.000307"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.909515" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.909412" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.909005" elapsed="0.000621"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.910559" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:16:52.910744" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:52.908446" elapsed="0.002357"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.912065" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.911120" elapsed="0.001006"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.913765" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.912418" elapsed="0.001409"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.921021" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.920735" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.921511" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.921268" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:52.930538" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:52.930595" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:52 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:52 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":21,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":21,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"425.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582212,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:52.930696" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:52.923553" elapsed="0.007169"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.921669" elapsed="0.009094"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.930938" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.930793" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.921649" elapsed="0.009393"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.934389" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":21,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":21,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"425.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582212,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.932094" elapsed="0.002386"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.931844" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.931826" elapsed="0.002715"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.936922" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:52.934819" elapsed="0.002151"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.934596" elapsed="0.002447"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.934579" elapsed="0.002490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.937590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.937223" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.937917" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.937686" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.938467" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.938171" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.938017" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.937668" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.939076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.938701" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:52.939396" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.939172" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.939913" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.939624" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.939475" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.939154" elapsed="0.000858"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.940155" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:52.940919" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.940652" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.941121" elapsed="0.002115"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:52.931432" elapsed="0.011865"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:52.943528" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:52.943420" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.943400" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:52.946407" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:52.943783" elapsed="0.002653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:52.946537" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:52.946885" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:52.915958" elapsed="0.030978"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:52.947025" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:52.947353" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.914198" elapsed="0.033214"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.949667" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582212, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:52.948839" elapsed="0.000879"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:52.949815" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:52.950193" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582212, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:52.947943" elapsed="0.002312"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.950907" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 21, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.950544" elapsed="0.000430"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:52.951702" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:52.951317" elapsed="0.000445"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:52.951997" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:52.952154" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:52.765058" elapsed="0.187120"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:52.952233" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:52.952375" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:52.764289" elapsed="0.188110"/>
</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="PASS" start="2026-04-07T17:16:52.952685" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.952476" elapsed="0.000471"/>
</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-07T17:16:52.953129" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.952974" 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-07T17:16:52.953370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:52.953206" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.952458" elapsed="0.000986"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:52.764123" elapsed="0.189344"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:52.957489" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:52.956853" elapsed="0.000686"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:52.957598" elapsed="0.000199"/>
</return>
<msg time="2026-04-07T17:16:52.958108" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:52.955518" elapsed="0.002649"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.004354" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.003958" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.005099" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.004865" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.005254" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.004538" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.005814" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.005435" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.006159" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:53.006314" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:53.006011" elapsed="0.000368"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.006776" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.006533" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.007753" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.007502" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.008225" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.007949" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.008554" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.008749" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.008916" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.008428" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.008298" elapsed="0.000719"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:53.009060" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.009215" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:53.007186" elapsed="0.002054"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.006886" elapsed="0.002385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.009434" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.009295" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.006867" elapsed="0.002642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.010082" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.009643" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.010184" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.003359" elapsed="0.006949"/>
</kw>
<msg time="2026-04-07T17:16:53.010358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:52.991867" elapsed="0.018541"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.022045" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.033453" elapsed="0.000033"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.044711" 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-07T17:16:53.044900" 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-07T17:16:53.045084" 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-07T17:16:53.045494" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.045349" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:53.045333" 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-07T17:16:53.045705" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.045866" 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-07T17:16:53.046043" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.045300" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.045201" elapsed="0.000922"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.046262" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.046336" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:53.046449" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:52.987943" elapsed="0.058531"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.047715" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.047476" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.047867" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.047139" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.048218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.047961" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.048738" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.048451" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.048298" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.047942" elapsed="0.000876"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.051007" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.048963" elapsed="0.002071"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:53.051084" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.051234" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.046798" elapsed="0.004461"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.052447" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.052206" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.052599" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.051859" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:53.052827" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.052694" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.052675" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.053066" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.053232" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.053296" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:53.055238" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.051546" elapsed="0.003719"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.056618" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.056375" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.057062" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.056807" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.075214" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.075611" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:53.075816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.059175" elapsed="0.016670"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.057170" elapsed="0.018718"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.076086" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.075914" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.057152" elapsed="0.019021"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.079665" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.077173" elapsed="0.002700"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.076934" elapsed="0.002974"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.076915" elapsed="0.003018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.082303" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.080224" elapsed="0.002123"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.080006" elapsed="0.002375"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.079975" elapsed="0.002430"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.082921" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.082556" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.083290" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.083035" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.083820" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.083524" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.083373" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.083015" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.084429" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.084071" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.084748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.084524" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.085285" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.084994" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.084827" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.084506" elapsed="0.000860"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.085509" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.086289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.086020" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.086462" elapsed="0.002123"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.076511" elapsed="0.012136"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.088817" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.088715" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.088697" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.095356" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.089038" elapsed="0.006348"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.095451" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:53.095609" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.055555" elapsed="0.040080"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.095696" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.095866" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:52.967403" elapsed="0.128511"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.096399" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.096102" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.096051" elapsed="0.000514"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.096649" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:52.962423" elapsed="0.134463"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:52.958373" elapsed="0.138588"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:52.958353" elapsed="0.138684"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:53.098088" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.097872" elapsed="0.000322"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.098331" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.098232" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.097814" elapsed="0.000627"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.099354" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:16:53.099565" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:53.097291" elapsed="0.002332"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.100847" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.099928" elapsed="0.000981"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.102517" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.101227" elapsed="0.001351"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.109683" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.109436" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.110186" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.109925" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.118557" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.118614" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:53 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Follower","LastApplied":21,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":21,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"307.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582213,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:53.118715" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.112243" elapsed="0.006497"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.110346" elapsed="0.008436"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.118961" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.118808" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.110326" elapsed="0.008740"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.122455" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":20,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":20,"Leader":"member-1-shard-topology-config","LastIndex":21,"RaftState":"Follower","LastApplied":21,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":21,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"307.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":21,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":950},"timestamp":1775582213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.120132" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.119901" elapsed="0.002683"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.119883" elapsed="0.002726"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.125036" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.122881" elapsed="0.002201"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.122664" elapsed="0.002452"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.122647" elapsed="0.002494"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.125663" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.125296" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.126009" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.125759" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.126545" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.126248" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.126092" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.125741" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.127161" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.126782" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.127484" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.127257" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.128056" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.127718" elapsed="0.000364"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.127565" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.127239" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.128283" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.129069" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.128780" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.129243" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.119464" elapsed="0.011952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.131644" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.131538" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.131518" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.134518" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.131897" elapsed="0.002649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.134646" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:16:53.135007" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.104687" elapsed="0.030371"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.135130" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:53.135453" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.102925" elapsed="0.032587"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.137646" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.136844" elapsed="0.000853"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:53.137795" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:16:53.138165" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:53.135935" elapsed="0.002291"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.138868" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 21, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.138513" elapsed="0.000416"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.139660" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.139273" elapsed="0.000445"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:53.139944" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:16:53.140128" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:52.954635" elapsed="0.185517"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:53.140210" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:53.140352" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:52.953780" elapsed="0.186597"/>
</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="PASS" start="2026-04-07T17:16:53.140664" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.140454" elapsed="0.000473"/>
</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-07T17:16:53.141110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.140951" elapsed="0.000215"/>
</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-07T17:16:53.141325" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.141189" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.140437" elapsed="0.000960"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:52.953619" elapsed="0.187802"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:52.530635" elapsed="0.610814"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.141488" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.141686" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:53.141732" level="INFO">${follower_list} = [2, 3]</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-07T17:16:52.526739" elapsed="0.615015"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.142303" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:53.142378" level="INFO">${leader_count} = 1</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-07T17:16:53.141924" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.142678" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.142470" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.142452" elapsed="0.000301"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.144662" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:53.142883" elapsed="0.001824"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:53.145068" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.144864" elapsed="0.000229"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.145138" 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="PASS" start="2026-04-07T17:16:52.524192" elapsed="0.621096"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:16:52.523962" elapsed="0.621371"/>
</iter>
<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-07T17:16:53.149819" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.149441" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.150365" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:53.150060" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:53.150434" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:53.150585" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.149074" elapsed="0.001535"/>
</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-07T17:16:53.150758" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.151414" 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-07T17:16:53.151083" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.151825" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:53.151591" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.152278" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:53.152009" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.156334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.155695" elapsed="0.000689"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:53.156444" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:53.156766" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:53.154361" elapsed="0.002462"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.203418" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.203039" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.204156" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.203927" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.204311" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.203603" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.204875" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.204494" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.205223" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:53.205347" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:53.205088" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.205763" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.205523" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.206737" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.206488" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.207212" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.206934" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.207540" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.207737" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.207902" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.207413" elapsed="0.000597"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.207285" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:53.208084" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.208242" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:53.206174" elapsed="0.002094"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.205874" elapsed="0.002426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.208466" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.208324" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.205855" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.209136" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.208677" elapsed="0.000487"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.209212" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.202415" elapsed="0.006918"/>
</kw>
<msg time="2026-04-07T17:16:53.209385" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.190849" elapsed="0.018587"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.221046" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.232280" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.243538" 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-07T17:16:53.243726" 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-07T17:16:53.243896" 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-07T17:16:53.244271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.244133" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:53.244118" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.244482" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.244644" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.244804" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.244090" elapsed="0.000768"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.243975" elapsed="0.000908"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.245037" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.245148" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:16:53.245264" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:53.186922" elapsed="0.058368"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.246512" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.246280" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.246664" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.245930" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.247014" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.246759" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.247540" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.247252" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.247097" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.246740" elapsed="0.000882"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.249832" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.247764" elapsed="0.002094"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:53.249909" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.250078" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.245614" elapsed="0.004489"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.251282" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.251049" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.251435" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.250705" elapsed="0.000754"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:53.251663" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.251529" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.251510" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.251883" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.252065" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.252132" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:53.254027" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.250394" elapsed="0.003660"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.255399" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.255156" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.255827" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.255590" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.267411" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.267800" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:53.268029" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.257855" elapsed="0.010202"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.255935" elapsed="0.012164"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.268275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.268125" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.255916" elapsed="0.012443"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.271833" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.269350" elapsed="0.002703"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.269137" elapsed="0.002953"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.269117" elapsed="0.002997"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.274501" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.272386" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.272170" elapsed="0.002409"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.272153" elapsed="0.002451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.275141" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.274756" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.275463" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.275237" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.276007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.275695" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.275544" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.275219" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.276599" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.276244" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.276918" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.276695" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.277458" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.277169" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.277015" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.276677" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.277679" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.278484" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.278215" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.278654" elapsed="0.002120"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.268696" elapsed="0.012140"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.281027" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.280905" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.280887" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.286778" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.281233" elapsed="0.005574"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.286859" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.287032" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.254350" elapsed="0.032709"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.287120" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.287290" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.166299" elapsed="0.121040"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.287796" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.287503" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.287454" elapsed="0.000509"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.288074" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:53.161200" elapsed="0.127110"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.157050" elapsed="0.131336"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.157029" elapsed="0.131414"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:53.289487" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.289291" elapsed="0.000301"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.289730" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.289629" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.289232" elapsed="0.000610"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.290764" elapsed="0.000054"/>
</kw>
<msg time="2026-04-07T17:16:53.290948" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:53.288692" elapsed="0.002332"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.292250" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.291325" elapsed="0.000987"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.293910" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.292598" elapsed="0.001376"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.301110" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.300844" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.301595" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.301353" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.310389" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.310448" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:53 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.249","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.249","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"571.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:53.310552" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.303664" elapsed="0.006913"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.301753" elapsed="0.008866"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.310791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.310644" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.301733" elapsed="0.009142"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.314272" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.249","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.249","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"571.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.311953" elapsed="0.002379"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.311742" elapsed="0.002625"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.311724" elapsed="0.002684"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.316774" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.314679" elapsed="0.002145"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.314465" elapsed="0.002393"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.314448" elapsed="0.002433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.317418" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.317052" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.317740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.317514" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.318284" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.317976" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.317821" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.317496" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.318903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.318545" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.319244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.319017" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.319766" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.319476" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.319325" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.318997" elapsed="0.000850"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.320009" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.320774" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.320507" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.320945" elapsed="0.002149"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.311323" elapsed="0.011833"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.323387" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.323280" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.323259" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.326465" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.323641" elapsed="0.002853"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.326622" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:16:53.327023" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.296098" elapsed="0.030977"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.327148" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:53.327473" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.294359" elapsed="0.033174"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.329687" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.328861" elapsed="0.000878"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:53.329802" elapsed="0.000068"/>
</return>
<msg time="2026-04-07T17:16:53.330186" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:53.327963" elapsed="0.002285"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.330918" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.330539" elapsed="0.000459"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.331712" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.331327" elapsed="0.000444"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:53.332006" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:16:53.332163" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:53.153471" elapsed="0.178717"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:53.332243" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.332387" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:16:53.152709" elapsed="0.179702"/>
</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-07T17:16:53.332697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.332488" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:16:53.333004" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.332778" elapsed="0.000488"/>
</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-07T17:16:53.333430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.333290" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.332471" elapsed="0.001034"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:53.152548" elapsed="0.180980"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.337550" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.336930" elapsed="0.000670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:53.337661" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:53.338063" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:53.335603" elapsed="0.002523"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.384548" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.384171" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.385336" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.385111" elapsed="0.000289">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.385491" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.384731" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.386070" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.385673" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.386385" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:53.386518" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:53.386251" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.386938" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.386692" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.387929" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.387681" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.388405" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.388145" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.388734" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.388935" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.389119" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.388608" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.388477" elapsed="0.000726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:53.389245" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:53.389398" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:53.387350" elapsed="0.002072"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.387070" elapsed="0.002384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.389618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.389479" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.387050" elapsed="0.002644"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.390263" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.389828" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.390338" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.383556" elapsed="0.006901"/>
</kw>
<msg time="2026-04-07T17:16:53.390509" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.372082" elapsed="0.018477"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.402029" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.413260" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.424529" 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-07T17:16:53.424715" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.424884" 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-07T17:16:53.425254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.425117" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:53.425102" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.425464" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.425625" 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-07T17:16:53.425784" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.425074" elapsed="0.000763"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.424959" elapsed="0.000902"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.426019" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.426097" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:53.426209" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:53.368084" elapsed="0.058150"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.427447" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.427205" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.427598" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.426854" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.427953" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.427693" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.428494" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.428208" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.428053" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.427674" elapsed="0.000901"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.430707" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.428718" elapsed="0.002015"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:53.430782" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:53.430931" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.426540" elapsed="0.004416"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.432282" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.431950" elapsed="0.000395">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.432437" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.431624" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:53.432666" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.432532" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.432513" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.432887" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.433076" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.433144" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:53.435017" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.431263" elapsed="0.003781"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.436406" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.436163" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.436835" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.436598" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.457237" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.457635" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:53.457835" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.438940" elapsed="0.018922"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.436950" elapsed="0.020955"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.458103" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.457931" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.436931" elapsed="0.021258"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.461681" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.459177" elapsed="0.002705"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.458943" elapsed="0.002974"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.458923" elapsed="0.003018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.464321" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.462233" elapsed="0.002133"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.462016" elapsed="0.002384"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.461997" elapsed="0.002445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.464968" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.464596" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.465311" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.465083" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.465839" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.465545" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.465392" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.465064" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.466448" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.466090" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.466769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.466544" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.467312" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.467020" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.466850" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.466526" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.467535" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.468324" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.468053" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.468521" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.458525" elapsed="0.012168"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.470866" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.470762" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.470743" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.476675" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.471095" elapsed="0.005609"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.476756" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.476912" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.435336" elapsed="0.041602"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.477017" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.477189" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.347436" elapsed="0.129802"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.477699" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.477403" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.477354" elapsed="0.000515"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.477958" elapsed="0.000084"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:53.342491" elapsed="0.135732"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.338331" elapsed="0.139968"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.338312" elapsed="0.140044"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:53.479417" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.479220" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.479664" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.479562" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.479160" elapsed="0.000615"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.480710" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:16:53.480902" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:53.478609" elapsed="0.002351"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.482208" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.481283" elapsed="0.000986"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.483864" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.482557" elapsed="0.001370"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.490921" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.490674" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.491578" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.491334" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.500813" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.500874" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:53 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"311.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:53.501019" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.493638" elapsed="0.007408"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.491735" elapsed="0.009351"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.501259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.501111" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.491715" elapsed="0.009628"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.505598" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"311.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.502386" elapsed="0.003309"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.502173" elapsed="0.003557"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.502155" elapsed="0.003600"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.508178" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.506046" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.505810" elapsed="0.002447"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.505793" elapsed="0.002488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.508802" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.508436" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.509176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.508903" elapsed="0.000332"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.509710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.509411" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.509259" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.508882" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.510321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.509944" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.510643" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.510417" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.511189" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.510875" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.510724" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.510399" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.511417" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.512206" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.511916" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.512379" elapsed="0.002124"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.501738" elapsed="0.012827"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.514793" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.514687" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.514667" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.517666" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.515077" elapsed="0.002618"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.517796" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:16:53.518158" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.486060" elapsed="0.032148"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.518279" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:16:53.518603" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.484291" elapsed="0.034371"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.520768" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.519975" elapsed="0.000845"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:53.520916" elapsed="0.000080"/>
</return>
<msg time="2026-04-07T17:16:53.521307" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:53.519101" elapsed="0.002267"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.522034" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.521656" elapsed="0.000440"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.522807" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.522423" elapsed="0.000445"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:53.523108" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:53.523262" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:53.334716" elapsed="0.188570"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:53.523342" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:16:53.523483" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:53.333839" elapsed="0.189668"/>
</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="PASS" start="2026-04-07T17:16:53.523792" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.523584" elapsed="0.000489"/>
</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-07T17:16:53.524238" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.524097" 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-07T17:16:53.524451" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.524315" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.523566" elapsed="0.000957"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:53.333678" elapsed="0.190868"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.528581" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.527962" elapsed="0.000669"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:16:53.528690" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:53.529094" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:53.526628" elapsed="0.002525"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.575680" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.575302" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.576429" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.576211" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.576583" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.575864" elapsed="0.000743"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.577164" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.576765" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.577478" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:16:53.577608" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:16:53.577344" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.578098" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.577825" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.579082" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.578807" elapsed="0.000319"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.579538" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.579279" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.579870" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.580094" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.580264" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.579743" elapsed="0.000578"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.579612" elapsed="0.000738"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:16:53.580392" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:53.580547" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:16:53.578494" elapsed="0.002078"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.578211" elapsed="0.002392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.580768" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.580627" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.578191" elapsed="0.002653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.581416" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.580997" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.581491" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.574680" elapsed="0.006930"/>
</kw>
<msg time="2026-04-07T17:16:53.581662" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.563129" elapsed="0.018583"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.593218" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.604476" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.615768" 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-07T17:16:53.615958" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.616148" 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-07T17:16:53.616542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.616402" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:16:53.616388" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.616756" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.616918" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.617099" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:16:53.616359" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.616259" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.617318" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.617394" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:16:53.617508" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:16:53.559201" elapsed="0.058332"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.618753" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.618520" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.618904" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.618175" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.619255" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.619016" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.619778" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.619490" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.619335" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.618996" elapsed="0.000863"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.622029" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.620027" elapsed="0.002029"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:16:53.622105" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:53.622256" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.617840" elapsed="0.004441"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:16:53.623483" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.623253" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:16:53.623635" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:16:53.622905" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:16:53.623861" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.623728" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.623710" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.624098" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.624264" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.624328" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:16:53.626275" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:16:53.622593" elapsed="0.003707"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.627669" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.627423" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.628120" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.627860" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.644740" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.645153" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:16:53.645348" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.630126" elapsed="0.015248"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.628230" elapsed="0.017187"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.645590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.645443" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.628212" elapsed="0.017462"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.649161" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.646662" elapsed="0.002721"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.646448" elapsed="0.002971"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.646429" elapsed="0.003015"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.651833" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.649719" elapsed="0.002159"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.649500" elapsed="0.002412"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.649483" elapsed="0.002453"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.652475" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.652107" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.652800" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.652572" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.653349" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.653052" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.652881" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.652553" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.653938" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.653583" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.654282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.654052" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.654803" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.654513" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.654362" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.654033" elapsed="0.000851"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.655067" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.655841" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.655571" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.656032" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.646032" elapsed="0.012173"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.658377" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.658274" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.658255" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.664096" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.658584" elapsed="0.005541"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.664177" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:53.664333" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.626610" elapsed="0.037749"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.664421" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.664592" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.538485" elapsed="0.126156"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.665122" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.664806" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.664757" elapsed="0.000534"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.665376" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:16:53.533552" elapsed="0.132060"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.529377" elapsed="0.136310"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.529357" elapsed="0.136386"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:16:53.666792" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.666595" elapsed="0.000309"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.667060" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.666941" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.666538" elapsed="0.000652"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.668101" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:16:53.668284" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:16:53.666014" elapsed="0.002329"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.669593" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.668641" elapsed="0.001012"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.671291" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.669947" elapsed="0.001406"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.678522" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.678274" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.679031" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.678765" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:16:53.687684" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:16:53.687741" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:16:53 GMT', 'Expires': 'Tue, 07 Apr 2026 16:16:53 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"246.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200} 
 </msg>
<msg time="2026-04-07T17:16:53.687841" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:16:53.681110" elapsed="0.006756"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.679190" elapsed="0.008718"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.688125" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.687934" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.679169" elapsed="0.009043"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.691775" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"246.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582213,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.689287" elapsed="0.002599"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.689073" elapsed="0.002852"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.689055" elapsed="0.002898"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.694349" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.692247" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.692028" elapsed="0.002399"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.692009" elapsed="0.002443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.695007" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.694610" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.695339" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.695106" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.695902" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.695603" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.695420" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.695088" elapsed="0.000914"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.696519" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.696159" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.696842" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.696615" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.697387" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:16:53.697093" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.696923" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.696597" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.697611" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:16:53.698405" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.698135" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.698579" elapsed="0.002141"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:16:53.688611" elapsed="0.012171"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.701046" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.700914" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.700893" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:16:53.703916" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:16:53.701305" elapsed="0.002640"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:16:53.704062" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:16:53.704419" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:16:53.673482" elapsed="0.030988"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:16:53.704541" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:16:53.704868" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:16:53.671700" elapsed="0.033228"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.707087" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:16:53.706294" elapsed="0.000845"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:16:53.707236" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:16:53.707592" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582213, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:16:53.705382" elapsed="0.002271"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.708379" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.708020" elapsed="0.000420"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.709184" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.708771" elapsed="0.000474"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:16:53.709471" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:53.709626" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:16:53.525742" elapsed="0.183908"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:16:53.709705" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:16:53.709847" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:16:53.524860" elapsed="0.185011"/>
</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="PASS" start="2026-04-07T17:16:53.710186" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-04-07T17:16:53.709948" elapsed="0.000499"/>
</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-07T17:16:53.710613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.710472" 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-07T17:16:53.710826" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.710690" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.709931" elapsed="0.000969"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:53.524700" elapsed="0.186227"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.152351" elapsed="0.558604"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.711013" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:53.711212" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:16:53.711257" level="INFO">${follower_list} = [2, 3]</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-07T17:16:53.148351" elapsed="0.562929"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.711711" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:16:53.711815" level="INFO">${leader_count} = 1</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-07T17:16:53.711446" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.712137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.711909" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.711890" elapsed="0.000324"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.714262" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:16:53.712343" elapsed="0.001964"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:16:53.714650" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.714467" elapsed="0.000208"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.714722" elapsed="0.000026"/>
</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="PASS" start="2026-04-07T17:16:53.145635" elapsed="0.569237"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:16:53.145416" elapsed="0.569501"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:16:52.523835" elapsed="1.191112"/>
</for>
<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="PASS" start="2026-04-07T17:16:52.523452" elapsed="1.191648"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:16:51.267467" elapsed="2.447730"/>
</kw>
<arg>90s</arg>
<arg>1s</arg>
<arg>Check Ovsdb Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:16:51.266916" elapsed="2.448330"/>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="PASS" start="2026-04-07T17:16:51.264642" elapsed="2.450662"/>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:16:50.896458" elapsed="2.818976"/>
</test>
<test id="s1-s1-s1-t29" name="Check Entity Owner Status After Recover" line="143">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:16:53.719268" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:16:53.719003" 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-07T17:16:53.720532" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.720423" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.720405" 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-07T17:16:53.725158" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.725052" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.725034" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.726235" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:53.725805" elapsed="0.000456"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.726712" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:53.726414" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:53.726781" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:53.726932" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:53.725440" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.732205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.732098" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.732079" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.733468" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.733364" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.733346" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.734038" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.733670" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.734469" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:53.734217" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.766578" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:53.735047" elapsed="0.031704"/>
</kw>
<msg time="2026-04-07T17:16:53.766922" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:53.767051" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.734649" elapsed="0.032443"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.824833" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:53.767651" elapsed="0.057396"/>
</kw>
<msg time="2026-04-07T17:16:53.825216" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:53.825261" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.767262" elapsed="0.058059"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.825616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.825400" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.825380" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.826302" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.825896" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.826663" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.826454" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.826436" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:53.826794" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.829095" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:16:53.830550" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:53.831966" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:53.827641" elapsed="0.004732"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:53.827070" elapsed="0.005415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:53.733065" elapsed="0.099519"/>
</kw>
<msg time="2026-04-07T17:16:53.832674" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:53.832717" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.732418" elapsed="0.100336"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:53.832938" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.832832" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.832813" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.833455" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.833784" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.833855" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:53.731736" elapsed="0.102230"/>
</kw>
<msg time="2026-04-07T17:16:53.834091" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:53.834135" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.727328" elapsed="0.106844"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.834489" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.834246" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.834229" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:16:53.727192" elapsed="0.107396"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.840050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.839920" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.839901" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.841302" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.841197" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.841179" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.841878" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.841528" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.842315" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:53.842073" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.875916" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:53.842912" elapsed="0.033188"/>
</kw>
<msg time="2026-04-07T17:16:53.876266" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:53.876312" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.842531" elapsed="0.033817"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.934398" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:53.876893" elapsed="0.057696"/>
</kw>
<msg time="2026-04-07T17:16:53.934771" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:53.934818" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.876512" elapsed="0.058343"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.935184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.934932" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.934912" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:53.935787" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:53.935422" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.936164" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.935935" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.935917" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:53.936295" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:53.938558" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:16:53.940029" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:53.941414" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:53.937122" elapsed="0.004678"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:53.936542" elapsed="0.005371"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:53.840869" elapsed="0.101160"/>
</kw>
<msg time="2026-04-07T17:16:53.942120" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:53.942163" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.840263" elapsed="0.101937"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:53.942380" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:16:53.942275" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.942257" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.942837" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.943192" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.943263" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:53.839586" elapsed="0.103783"/>
</kw>
<msg time="2026-04-07T17:16:53.943499" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:53.943543" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.834841" elapsed="0.108738"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:53.943898" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:53.943655" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.943638" elapsed="0.000356"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:16:53.834707" elapsed="0.109312"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.949171" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.949065" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.949046" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:16:53.950415" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:53.950309" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:53.950292" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:53.951005" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:53.950620" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.951432" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:16:53.951187" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:16:53.982447" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:16:53.952005" elapsed="0.030598"/>
</kw>
<msg time="2026-04-07T17:16:53.982787" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:16:53.982833" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.951613" elapsed="0.031256"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:16:54.041667" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:16:53.983457" elapsed="0.058401"/>
</kw>
<msg time="2026-04-07T17:16:54.042049" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:16:54.042094" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.983057" elapsed="0.059074"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.042421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:54.042207" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:54.042188" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.043051" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:16:54.042660" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.043408" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:54.043201" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:54.043183" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:16:54.043538" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:16:54.045816" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:16:54.047249" elapsed="0.000452"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:16:54.049243" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:16:54.044410" elapsed="0.005224"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:16:54.043785" elapsed="0.005962"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:16:53.950009" elapsed="0.099838"/>
</kw>
<msg time="2026-04-07T17:16:54.049937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:54.050002" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.949384" elapsed="0.100658"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:16:54.050225" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:16:54.050119" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:54.050101" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.050685" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.051039" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.051111" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:16:53.948700" elapsed="0.102517"/>
</kw>
<msg time="2026-04-07T17:16:54.051309" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:16:54.051352" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.944272" elapsed="0.107116"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.051702" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:16:54.051462" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:54.051445" elapsed="0.000334"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:16:53.944139" elapsed="0.107663"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:16:53.727025" elapsed="0.324805"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:16:53.724681" elapsed="0.327202"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:16:53.720141" elapsed="0.331796"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:53.719674" elapsed="0.332324"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:16:53.716575" elapsed="0.335478"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:16:54.085881" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:54.085505" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.086386" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:54.086084" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:54.086456" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:16:54.086607" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:54.085142" elapsed="0.001489"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:54.091127" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:54.090926" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:54.091519" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.091300" elapsed="0.000286">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.091788" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.091989" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.092149" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.092308" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.092485" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.092644" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.092817" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.093027" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.102891" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.103099" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.112774" 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-07T17:16:54.112966" elapsed="0.000034"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.113046" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.090398" elapsed="0.022783">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:54.113291" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:54.113334" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:54.089832" elapsed="0.023525"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.113545" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:54.113438" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:54.113420" 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-07T17:16:54.114930" elapsed="0.000230"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.115621" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:54.115315" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:54.116443" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:54.116181" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:54.116516" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:16:54.116662" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:54.115829" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.117246" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:54.116841" elapsed="0.000433"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.117814" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:54.117466" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:54.118255" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:54.131163" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:54.118016" elapsed="0.015794">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.134093" 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-07T17:16:54.134273" 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-07T17:16:54.134441" 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-07T17:16:54.134607" 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-07T17:16:54.134774" 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-07T17:16:54.134931" 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-07T17:16:54.135231" 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-07T17:16:54.135398" 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-07T17:16:54.135554" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:54.135107" elapsed="0.000500"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.135037" 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-07T17:16:54.135768" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.135826" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.114394" elapsed="0.021552">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:54.136092" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:54.136136" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:54.113783" elapsed="0.022375"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:54.136790" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.136458" elapsed="0.000391">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:54.136244" elapsed="0.000668">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:54.136226" elapsed="0.000718">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.137016" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.089292" elapsed="0.047825">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.137289" elapsed="0.000074"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.137526" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.137589" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:54.086922" elapsed="0.050768">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:54.137855" 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-07T17:16:54.138047" 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-07T17:16:54.138214" 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-07T17:16:54.138368" 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-07T17:16:54.138533" 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-07T17:16:54.138691" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:54.138751" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.084515" elapsed="0.054333">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:55.171193" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:55.170663" elapsed="0.000566"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:55.171712" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:55.171396" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:55.171787" elapsed="0.000073"/>
</return>
<msg time="2026-04-07T17:16:55.172022" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:55.170277" elapsed="0.001770"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:55.176602" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:55.176408" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:55.177031" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.176774" elapsed="0.000336">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.177275" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.177478" elapsed="0.000019"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.177630" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.177801" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.177995" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.178230" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.178405" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.178561" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.188343" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.188536" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.198312" 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-07T17:16:55.198502" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.198568" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.175858" elapsed="0.022829">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:55.198802" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:55.198846" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:55.175303" elapsed="0.023565"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.199092" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:55.198957" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:55.198936" 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-07T17:16:55.200462" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:55.201149" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:55.200819" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:55.202136" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:55.201686" elapsed="0.000476"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:55.202210" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:55.202359" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:55.201356" elapsed="0.001028"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:55.202910" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:55.202541" elapsed="0.000395"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:55.203463" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:55.203113" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:55.203881" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:55.216002" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:55.203647" elapsed="0.016120">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.220294" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.220675" 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-07T17:16:55.221073" 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-07T17:16:55.221440" 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-07T17:16:55.221808" 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-07T17:16:55.222198" 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-07T17:16:55.222805" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.223210" 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-07T17:16:55.223558" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:55.222527" elapsed="0.001147"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.222369" elapsed="0.001363"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.224067" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.224199" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.199908" elapsed="0.024531">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:55.224688" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:55.224785" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:55.199309" elapsed="0.025528"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:55.226260" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.225525" elapsed="0.000942">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:55.225050" elapsed="0.001558">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:55.225006" elapsed="0.001672">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.226778" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.174741" elapsed="0.052294">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.227263" 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-07T17:16:55.227425" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.227485" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:55.172348" elapsed="0.055234">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.227788" 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-07T17:16:55.227963" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:55.228150" 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-07T17:16:55.228311" 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-07T17:16:55.228470" 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-07T17:16:55.228627" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:55.228686" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:55.169466" elapsed="0.059317">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:56.260523" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:56.260030" elapsed="0.000528"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:56.261078" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:56.260727" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:56.261154" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:16:56.261331" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:56.259616" elapsed="0.001740"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:56.266255" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:56.266062" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:56.266665" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.266430" elapsed="0.000308">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.266902" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267120" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267276" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267437" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267616" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267778" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.267954" elapsed="0.000036"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.268131" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.277918" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.278203" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.288084" 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-07T17:16:56.288278" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.288346" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.265510" elapsed="0.022952">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:56.288574" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:56.288617" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:56.264904" elapsed="0.023736"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.288846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:56.288729" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:56.288709" 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-07T17:16:56.290268" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:56.290940" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:56.290629" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:56.291762" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:56.291499" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:56.291837" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:56.292002" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:56.291166" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:56.292550" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:56.292186" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:56.293092" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:56.292728" elapsed="0.000390"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:56.293531" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:56.307350" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:56.293299" elapsed="0.017576">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.311320" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.311701" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.312098" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.312466" 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-07T17:16:56.312839" 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-07T17:16:56.313237" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.313946" elapsed="0.000078"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.314360" 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-07T17:16:56.314721" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:56.313664" elapsed="0.001174"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.313503" elapsed="0.001393"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.315235" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.315368" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.289710" elapsed="0.025897">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:56.315858" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:56.315955" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:56.289077" elapsed="0.026973"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:56.317452" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.316708" elapsed="0.000932">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:56.316236" elapsed="0.001547">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:56.316195" elapsed="0.001659">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.317956" elapsed="0.000067"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.264354" elapsed="0.053860">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.318536" 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-07T17:16:56.318699" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.318760" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:56.261656" elapsed="0.057202">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:56.319036" 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-07T17:16:56.319213" 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-07T17:16:56.319377" 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-07T17:16:56.319535" 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-07T17:16:56.319696" 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-07T17:16:56.319855" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:56.319950" elapsed="0.000019"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:56.258786" elapsed="0.061280">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:57.350682" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:57.350197" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:57.351255" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:57.350904" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:57.351331" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:16:57.351509" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:57.349787" 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-07T17:16:57.356126" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:57.355917" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:57.356550" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.356313" elapsed="0.000533">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357035" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357240" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357397" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357561" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357738" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.357897" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.358085" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.358244" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.368258" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.368456" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.378190" 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-07T17:16:57.378388" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.378536" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.355384" elapsed="0.023273">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:57.378769" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:57.378813" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:57.354788" elapsed="0.024047"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.379112" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:57.378944" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:57.378922" elapsed="0.000265"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:57.380551" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:57.381245" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:57.380914" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:57.382066" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:57.381785" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:57.382138" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:16:57.382285" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:57.381453" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:57.382830" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:57.382466" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:57.383380" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:57.383026" elapsed="0.000379"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:57.383843" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:57.397027" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:57.383562" elapsed="0.017079">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.401082" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.401450" 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-07T17:16:57.401804" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.402222" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.402594" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.402939" elapsed="0.000081"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.403599" 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-07T17:16:57.403966" elapsed="0.000075"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.404345" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:57.403317" elapsed="0.001144"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.403126" elapsed="0.001392"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.404815" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.404943" elapsed="0.000060"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.379946" elapsed="0.025344">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:57.405543" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:57.405639" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:57.379338" elapsed="0.026352"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:57.407625" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.406390" elapsed="0.001369">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:57.405872" elapsed="0.002027">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:57.405832" elapsed="0.002168">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.408107" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.354238" elapsed="0.054083">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.408578" 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-07T17:16:57.408741" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.408803" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:57.351833" elapsed="0.057067">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:57.409078" 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-07T17:16:57.409252" 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-07T17:16:57.409416" 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-07T17:16:57.409572" 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-07T17:16:57.409732" 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-07T17:16:57.409889" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:57.409950" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:57.349024" elapsed="0.061040">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:58.440093" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:58.439592" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:58.440611" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:58.440296" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:58.440684" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:16:58.440862" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:58.439098" elapsed="0.001788"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:58.445424" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:58.445234" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:58.445830" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.445597" elapsed="0.000307">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446083" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446285" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446439" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446596" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446772" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.446929" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.447118" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.447273" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.457257" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.457451" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.467130" 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-07T17:16:58.467319" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.467385" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.444685" elapsed="0.022816">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:58.467612" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:58.467656" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:58.444130" elapsed="0.023574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.467961" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:58.467796" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:58.467776" elapsed="0.000271"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:16:58.469358" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:58.470054" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:58.469724" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:58.471067" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:58.470780" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:58.471142" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:58.471292" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:58.470431" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:58.471861" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:58.471471" elapsed="0.000416"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:58.472399" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:58.472055" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:58.472825" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:58.484573" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:58.472581" elapsed="0.014423">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.487258" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.487493" 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-07T17:16:58.487717" 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-07T17:16:58.487967" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.488220" 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-07T17:16:58.488437" 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-07T17:16:58.488809" 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-07T17:16:58.489062" 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-07T17:16:58.489283" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:58.488631" elapsed="0.000727"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.488533" elapsed="0.000862"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.489585" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.489667" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.468798" elapsed="0.021021">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:58.490005" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:58.490069" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:58.468194" elapsed="0.021908"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:58.491031" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.490566" elapsed="0.000551">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:58.490269" elapsed="0.000935">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:58.490242" elapsed="0.001007">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.491313" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.443571" elapsed="0.047879">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.491695" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.491943" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.492051" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:58.441201" elapsed="0.050987">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.492417" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.492672" 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-07T17:16:58.492939" 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-07T17:16:58.493184" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:58.493411" 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-07T17:16:58.493635" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:58.493720" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:58.438329" elapsed="0.055528">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:16:59.526335" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:59.525785" elapsed="0.000587"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:16:59.526864" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:16:59.526546" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:16:59.526939" elapsed="0.000067"/>
</return>
<msg time="2026-04-07T17:16:59.527167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:16:59.525392" elapsed="0.001800"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:16:59.531845" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:16:59.531649" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:16:59.532286" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.532037" elapsed="0.000337">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.532536" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.532749" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.532902" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.533075" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.533252" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.533411" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.533581" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.533737" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.543583" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.543775" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.553398" 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-07T17:16:59.553587" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.553652" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.531111" elapsed="0.022657">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:16:59.553880" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:59.553923" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:59.530514" elapsed="0.023432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.554170" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:16:59.554052" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:16:59.554030" 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-07T17:16:59.555549" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:16:59.556242" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:16:59.555909" elapsed="0.000360"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:16:59.557230" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:16:59.556935" elapsed="0.000323"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:16:59.557339" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:16:59.557488" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:16:59.556450" elapsed="0.001062"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:16:59.558067" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:16:59.557666" elapsed="0.000427"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:16:59.558591" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:16:59.558246" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:16:59.559030" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:16:59.571638" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:16:59.558773" elapsed="0.016803">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.575966" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.576228" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.576453" 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-07T17:16:59.576676" 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-07T17:16:59.576906" 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-07T17:16:59.577154" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.577537" 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-07T17:16:59.577768" 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-07T17:16:59.578007" elapsed="0.000031"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:16:59.577362" elapsed="0.000723"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.577255" 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-07T17:16:59.578314" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.578396" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.555002" elapsed="0.023542">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:16:59.578698" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:16:59.578758" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:16:59.554383" elapsed="0.024408"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:16:59.580091" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.579240" elapsed="0.000936">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:16:59.578905" elapsed="0.001368">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:16:59.578880" elapsed="0.001438">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.580381" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.529954" elapsed="0.050563">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.580809" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.581060" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.581148" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:16:59.527582" elapsed="0.053701">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.581510" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.581751" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.582030" elapsed="0.000034"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:16:59.582264" 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-07T17:16:59.582491" 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-07T17:16:59.582712" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:16:59.582796" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:16:59.524565" elapsed="0.058368">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:00.611969" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:00.611290" elapsed="0.000747"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:00.612577" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:00.612235" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:00.612658" elapsed="0.000076"/>
</return>
<msg time="2026-04-07T17:17:00.612885" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:00.610838" elapsed="0.002071"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:00.623733" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:00.623170" elapsed="0.000665"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:00.624818" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.624276" elapsed="0.000732">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.625373" elapsed="0.000049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.625860" elapsed="0.000047"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.626123" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.626283" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.626567" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.626730" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.626903" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.627076" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.636905" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.637117" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.647024" 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-07T17:17:00.647217" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.647291" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.621912" elapsed="0.025521">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:00.647550" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:00.647593" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:00.620474" elapsed="0.027141"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.647859" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:00.647711" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:00.647688" 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-07T17:17:00.649292" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:00.650019" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:00.649657" elapsed="0.000389"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:00.650837" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:00.650569" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:00.650911" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:17:00.651083" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:00.650234" elapsed="0.000874"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:00.651649" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:00.651270" elapsed="0.000405"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:00.652199" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:00.651830" elapsed="0.000395"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:00.652630" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:00.671384" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:00.652383" elapsed="0.022885">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.675619" 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-07T17:17:00.675894" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.676163" 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-07T17:17:00.676405" 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-07T17:17:00.676651" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.676887" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.677334" 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-07T17:17:00.677580" 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-07T17:17:00.677812" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:00.677144" elapsed="0.000744"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.677020" elapsed="0.000911"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.678195" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.678290" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.648730" elapsed="0.029729">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:00.678629" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:00.678693" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:00.648094" elapsed="0.030634"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:00.679703" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.679199" elapsed="0.000599">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:00.678852" elapsed="0.001039">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:00.678824" elapsed="0.001115">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.680034" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.619026" elapsed="0.061160">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.680442" elapsed="0.000033"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.680687" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.680778" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:00.613246" elapsed="0.067678">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.681252" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.681515" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.681769" elapsed="0.000031"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:00.682030" 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-07T17:17:00.682319" 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-07T17:17:00.682557" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:00.682649" elapsed="0.000023"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:00.609804" elapsed="0.072997">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:01.713193" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:01.712645" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:01.713736" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:01.713403" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:01.713812" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:17:01.714018" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:01.712235" elapsed="0.001810"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:01.719002" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:01.718789" elapsed="0.000242"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:01.719423" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.719181" elapsed="0.000322">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.719710" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.719931" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720107" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720269" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720447" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720607" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720792" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.720952" elapsed="0.000036"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.730820" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.731114" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.740814" 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-07T17:17:01.741018" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.741087" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.718239" elapsed="0.022964">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:01.741318" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:01.741361" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:01.717650" elapsed="0.023733"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.741588" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:01.741472" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:01.741452" 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-07T17:17:01.742987" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:01.743661" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:01.743350" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:01.744538" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:01.744274" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:01.744612" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:01.744758" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:01.743919" elapsed="0.000863"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:01.745321" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:01.744937" elapsed="0.000410"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:01.745843" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:01.745501" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:01.746286" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:01.760376" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:01.746047" elapsed="0.018256">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.764720" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.765135" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.765533" 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-07T17:17:01.765891" 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-07T17:17:01.766334" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.766683" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.767459" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.767830" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.768264" elapsed="0.000036"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:01.767176" elapsed="0.001176"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.767007" elapsed="0.001383"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.768578" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.768660" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.742432" elapsed="0.026379">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:01.768990" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:01.769054" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:01.741800" elapsed="0.027286"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:01.769940" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.769491" elapsed="0.000555">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:01.769200" elapsed="0.000933">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:01.769175" elapsed="0.001002">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.770240" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.717092" elapsed="0.053281">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.770610" 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-07T17:17:01.770831" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.770914" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:01.714350" elapsed="0.056721">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.771294" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.771535" 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-07T17:17:01.771761" 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-07T17:17:01.772017" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:01.772244" 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-07T17:17:01.772460" elapsed="0.000069"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:01.772590" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:01.711346" elapsed="0.061380">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:02.804333" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:02.803810" elapsed="0.000556"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:02.804884" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:02.804535" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:02.804961" elapsed="0.000067"/>
</return>
<msg time="2026-04-07T17:17:02.805166" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:02.803420" elapsed="0.001771"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:02.809756" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:02.809564" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:02.810181" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.809929" elapsed="0.000327">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.810655" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.810863" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811035" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811198" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811377" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811539" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811713" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.811867" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.821697" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.821891" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.831695" 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-07T17:17:02.831889" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.832037" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.809025" elapsed="0.023134">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:02.832274" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:02.832318" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:02.808439" elapsed="0.023901"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.832548" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:02.832431" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:02.832410" 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-07T17:17:02.833955" elapsed="0.000230"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:02.834650" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:02.834338" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:02.835484" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:02.835215" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:02.835556" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:02.835703" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:02.834859" elapsed="0.000869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:02.836299" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:02.835883" elapsed="0.000442"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:02.836827" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:02.836483" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:02.837291" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:02.848467" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:02.837048" elapsed="0.015298">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.852753" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.853174" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.853547" 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-07T17:17:02.853905" 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-07T17:17:02.854318" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.854675" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.855290" 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-07T17:17:02.855662" 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-07T17:17:02.856043" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:02.855007" elapsed="0.001156"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.854822" elapsed="0.001400"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.856524" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.856655" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.833416" elapsed="0.023588">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:02.857312" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:02.857398" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:02.832762" elapsed="0.024659"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:02.858054" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.857718" elapsed="0.000395">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:02.857505" elapsed="0.000671">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:02.857486" elapsed="0.000722">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.858253" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.807874" elapsed="0.050477">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.858522" 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-07T17:17:02.858683" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.858744" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:02.805491" elapsed="0.053351">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:02.859019" 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-07T17:17:02.859195" 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-07T17:17:02.859363" 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-07T17:17:02.859521" 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-07T17:17:02.859684" 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-07T17:17:02.859842" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:02.859904" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:02.802634" elapsed="0.057383">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:03.890067" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:03.889562" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:03.890589" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:03.890276" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:03.890662" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:17:03.890843" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:03.889085" elapsed="0.001782"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:03.895427" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:03.895237" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:03.895839" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.895600" elapsed="0.000318">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896096" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896303" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896458" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896615" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896792" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.896949" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.897140" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.897296" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.907223" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.907418" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.917294" 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-07T17:17:03.917511" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.917580" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.894687" elapsed="0.023017">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:03.917817" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:03.917860" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:03.894132" elapsed="0.023750"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.918139" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:03.917985" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:03.917950" 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-07T17:17:03.919513" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:03.920213" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:03.919879" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:03.921196" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:03.920754" elapsed="0.000468"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:03.921270" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:03.921419" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:03.920422" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:03.921996" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:03.921612" elapsed="0.000411"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:03.922523" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:03.922176" elapsed="0.000373"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:03.922939" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:03.934108" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:03.922706" elapsed="0.014859">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.937995" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.938375" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.938757" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.939144" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.939519" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.939896" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.940514" 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-07T17:17:03.940883" 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-07T17:17:03.941271" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:03.940238" elapsed="0.001152"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.940082" elapsed="0.001367"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.941770" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.941901" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.918959" elapsed="0.023213">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:03.942425" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:03.942522" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:03.918359" elapsed="0.024222"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:03.944134" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.943371" elapsed="0.000896">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:03.942866" elapsed="0.001540">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:03.942824" elapsed="0.001654">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.944578" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.893573" elapsed="0.051220">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.945206" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.945610" elapsed="0.000049"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.945754" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:03.891183" elapsed="0.054818">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:03.946370" 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-07T17:17:03.946732" 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-07T17:17:03.946914" 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-07T17:17:03.947086" 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-07T17:17:03.947249" 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-07T17:17:03.947407" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:03.947467" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:03.888300" elapsed="0.059264">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:04.977495" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:04.976990" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:04.978023" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:04.977694" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:04.978097" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:04.978267" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:04.976593" 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-07T17:17:04.983267" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:04.983079" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:04.983671" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:04.983442" elapsed="0.000303">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.983908" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984126" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984284" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984443" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984621" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984781" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.984954" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.985175" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.995006" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:04.995200" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.004910" 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-07T17:17:05.005113" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.005179" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:04.982517" elapsed="0.022777">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:05.005406" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:05.005449" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:04.981937" elapsed="0.023535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.005690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:05.005576" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:05.005555" 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-07T17:17:05.007065" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:05.007737" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:05.007426" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:05.008554" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:05.008292" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:05.008668" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:05.008817" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:05.007942" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:05.009383" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:05.009015" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:05.009937" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:05.009584" elapsed="0.000379"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:05.010376" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:05.023520" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:05.010144" elapsed="0.017104">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.027697" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.028158" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.028536" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.028914" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.029332" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.029708" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.030324" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.030695" 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-07T17:17:05.031072" elapsed="0.000050"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:05.030043" elapsed="0.001154"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.029860" elapsed="0.001394"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.031553" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.031686" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:05.006514" elapsed="0.025412">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:05.032209" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:05.032307" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:05.005902" elapsed="0.026457"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:05.033843" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:05.033080" elapsed="0.000928">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:05.032540" elapsed="0.001614">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:05.032500" elapsed="0.001725">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.034326" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:04.981368" elapsed="0.053174">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.034869" 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-07T17:17:05.035048" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.035111" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:04.978679" elapsed="0.056532">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:05.035375" 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-07T17:17:05.035547" 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-07T17:17:05.035711" 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-07T17:17:05.035866" 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-07T17:17:05.036042" 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-07T17:17:05.036202" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:05.036262" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:04.975831" elapsed="0.060528">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:06.065903" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:06.065423" elapsed="0.000513"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:06.066438" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:06.066120" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:06.066513" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:17:06.066685" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:06.065032" 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-07T17:17:06.071270" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:06.071081" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:06.071675" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.071444" elapsed="0.000544">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.072155" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.072357" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.072511" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.072672" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.072928" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.073133" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.073311" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.073471" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.083575" elapsed="0.000053"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.083813" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.093575" 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-07T17:17:06.093772" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.093840" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.070535" elapsed="0.023449">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:06.094158" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:06.094203" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:06.069957" elapsed="0.024269"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.094438" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:06.094317" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:06.094296" 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-07T17:17:06.095849" elapsed="0.000231"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:06.096542" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:06.096231" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:06.097391" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:06.097124" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:06.097465" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:06.097612" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:06.096749" elapsed="0.000887"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:06.098179" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:06.097791" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:06.098702" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:06.098360" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:06.099129" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:06.113545" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:06.098884" elapsed="0.018872">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.118349" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.118762" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.119194" elapsed="0.000051"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.119589" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.120018" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.120405" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.121067" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.121490" 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-07T17:17:06.121868" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:06.120739" elapsed="0.001281"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.120566" elapsed="0.001521"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.122416" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.122557" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.095300" elapsed="0.027522">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:06.123130" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:06.123238" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:06.094652" elapsed="0.028642"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:06.124807" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.124035" elapsed="0.000912">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:06.123496" elapsed="0.001629">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:06.123452" elapsed="0.001798">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.125365" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.069410" elapsed="0.056193">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.126014" elapsed="0.000273"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.126442" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.126505" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:06.067028" elapsed="0.059577">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:06.126806" 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-07T17:17:06.126999" 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-07T17:17:06.127168" 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-07T17:17:06.127326" 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-07T17:17:06.127488" 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-07T17:17:06.127647" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:06.127708" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:06.064222" elapsed="0.063586">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:07.157772" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:07.157250" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:07.158322" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:07.157997" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:07.158397" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:17:07.158581" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:07.156837" 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-07T17:17:07.163226" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:07.163024" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:07.163648" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.163405" elapsed="0.000320">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.163890" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.164113" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.164301" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.164483" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.164663" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.164829" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.165017" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.165177" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.175117" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.175383" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.185429" 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-07T17:17:07.185629" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.185696" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.162462" elapsed="0.023356">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:07.185931" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:07.185990" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:07.161883" elapsed="0.024131"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.186227" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:07.186106" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:07.186085" 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-07T17:17:07.187607" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:07.188512" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:07.187969" elapsed="0.000644"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:07.189502" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:07.189237" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:07.189575" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:07.189721" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:07.188853" elapsed="0.000892"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:07.190293" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:07.189898" elapsed="0.000421"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:07.190812" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:07.190473" elapsed="0.000365"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:07.191245" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:07.204183" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:07.191009" elapsed="0.017213">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.208697" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.209106" 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-07T17:17:07.209333" 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-07T17:17:07.209554" 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-07T17:17:07.209780" 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-07T17:17:07.210015" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.210463" 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-07T17:17:07.210696" 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-07T17:17:07.210916" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:07.210284" elapsed="0.000726"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.210177" elapsed="0.000873"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.211244" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.211327" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.187065" elapsed="0.024413">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:07.211636" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:07.211697" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:07.186441" elapsed="0.025288"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:07.212664" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.212158" elapsed="0.000606">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:07.211844" elapsed="0.001015">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:07.211819" elapsed="0.001085">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.212966" elapsed="0.000044"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.161342" elapsed="0.051786">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.213368" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.213591" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.213675" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:07.158904" elapsed="0.054905">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:07.214052" 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-07T17:17:07.214297" 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-07T17:17:07.214524" 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-07T17:17:07.214742" 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-07T17:17:07.214963" 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-07T17:17:07.215208" elapsed="0.000074"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:07.215345" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:07.156007" elapsed="0.059475">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:08.249288" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:08.248779" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:08.249804" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:08.249493" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:08.249877" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:17:08.250069" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:08.248393" 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-07T17:17:08.254692" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:08.254504" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:08.255139" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.254863" elapsed="0.000355">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.255380" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.255583" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.255736" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.255891" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.256082" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.256243" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.256414" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.256571" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.266323" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.266515" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.276273" 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-07T17:17:08.276476" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.276618" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.253921" elapsed="0.022821">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:08.276859" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:08.276904" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:08.253368" elapsed="0.023559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.277159" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:08.277035" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:08.277014" 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-07T17:17:08.278544" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:08.279287" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:08.278904" elapsed="0.000416"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:08.280288" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:08.280018" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:08.280362" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:08.280510" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:08.279512" elapsed="0.001022"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:08.281074" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:08.280691" elapsed="0.000409"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:08.281602" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:08.281258" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:08.282024" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:08.291319" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:08.281785" elapsed="0.011974">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.294037" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.294278" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.294502" 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-07T17:17:08.294725" 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-07T17:17:08.294953" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.295225" elapsed="0.000035"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.295601" 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-07T17:17:08.295840" 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-07T17:17:08.296080" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:08.295426" elapsed="0.000730"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.295330" elapsed="0.000865"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.296385" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.296467" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.278001" elapsed="0.018666">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:08.296828" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:08.296889" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:08.277372" elapsed="0.019550"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:08.297818" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.297373" elapsed="0.000526">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:08.297077" elapsed="0.000933">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:08.297050" elapsed="0.001008">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.298123" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.252811" elapsed="0.045448">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.298500" 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-07T17:17:08.298727" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.298814" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:08.250389" elapsed="0.048561">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.299213" 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-07T17:17:08.299461" 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-07T17:17:08.299689" 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-07T17:17:08.299905" 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-07T17:17:08.300150" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:08.300381" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:08.300468" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:08.247630" elapsed="0.052973">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:09.331104" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:09.330607" elapsed="0.000530"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:09.331622" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:09.331306" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:09.331698" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:17:09.331870" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:09.330126" 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-07T17:17:09.336831" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:09.336641" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:09.337255" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.337019" elapsed="0.000309">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.337491" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.337736" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.337897" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.338071" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.338249" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.338407" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.338578" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.338733" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.348618" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.348810" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.358667" 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-07T17:17:09.358858" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.358924" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.336110" elapsed="0.022941">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:09.359164" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:09.359207" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:09.335533" elapsed="0.023696"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.359467" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:09.359316" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:09.359296" 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-07T17:17:09.360840" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:09.361522" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:09.361214" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:09.362415" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:09.362154" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:09.362491" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:09.362638" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:09.361772" elapsed="0.000890"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:09.363216" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:09.362817" elapsed="0.000425"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:09.363743" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:09.363400" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:09.364171" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:09.378287" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:09.363924" elapsed="0.018652">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.383082" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.383471" 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-07T17:17:09.383827" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.384217" 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-07T17:17:09.384590" 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-07T17:17:09.384942" 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-07T17:17:09.385565" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.386030" elapsed="0.000049"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.386393" elapsed="0.000051"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:09.385288" elapsed="0.001229"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.385131" elapsed="0.001445"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.386874" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.387035" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.360300" elapsed="0.026997">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:09.387563" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:09.387660" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:09.359685" elapsed="0.028027"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:09.389312" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.388556" elapsed="0.000888">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:09.387999" elapsed="0.001583">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:09.387930" elapsed="0.001723">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.389810" elapsed="0.000046"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.334986" elapsed="0.055146">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.390516" 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-07T17:17:09.390692" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.390754" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:09.332207" elapsed="0.058645">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:09.391030" 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-07T17:17:09.391204" 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-07T17:17:09.391368" 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-07T17:17:09.391523" 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-07T17:17:09.391685" 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-07T17:17:09.391843" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:09.391904" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:09.329293" elapsed="0.062722">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:10.421168" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:10.420670" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:10.421686" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:10.421372" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:10.421759" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:17:10.421932" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:10.420281" 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-07T17:17:10.426596" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:10.426406" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:10.427016" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.426769" elapsed="0.000320">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.427494" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.427702" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.427860" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.428076" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.428260" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.428419" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.428593" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.428749" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.438521" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.438712" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.448582" 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-07T17:17:10.448773" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.448838" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.425857" elapsed="0.023099">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:10.449083" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:10.449126" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:10.425299" elapsed="0.023850"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.449352" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:10.449236" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:10.449215" 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-07T17:17:10.450719" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:10.451412" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:10.451097" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:10.452268" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:10.451958" elapsed="0.000337"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:10.452386" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:10.452535" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:10.451626" elapsed="0.000934"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:10.453100" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:10.452715" elapsed="0.000411"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:10.453622" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:10.453279" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:10.454053" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:10.465833" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:10.453805" elapsed="0.014481">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.468548" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.468949" elapsed="0.000081"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.469355" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.469721" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.470127" elapsed="0.000053"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.470494" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.471108" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.471487" 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-07T17:17:10.471844" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:10.470794" elapsed="0.001197"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.470642" elapsed="0.001431"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.472381" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.472517" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.450183" elapsed="0.022575">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:10.473041" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:10.473146" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:10.449564" elapsed="0.023635"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:10.474596" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.473857" elapsed="0.000874">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:10.473385" elapsed="0.001487">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:10.473344" elapsed="0.001601">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.475080" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.424743" elapsed="0.050560">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.475774" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.476252" elapsed="0.000053"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.476404" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:10.422347" elapsed="0.054293">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:10.476876" 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-07T17:17:10.477065" 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-07T17:17:10.477232" 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-07T17:17:10.477391" 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-07T17:17:10.477553" 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-07T17:17:10.477712" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:10.477772" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:10.419494" elapsed="0.058376">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:11.507927" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:11.507445" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:11.508460" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:11.508145" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:11.508533" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:11.508704" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:11.507059" 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-07T17:17:11.513318" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:11.513129" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:11.513725" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.513492" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.513958" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.514193" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.514350" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.514509" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.514764" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.514927" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.515119" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.515277" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.525161" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.525356" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.535104" 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-07T17:17:11.535293" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.535360" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.512578" elapsed="0.022897">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:11.535587" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:11.535629" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:11.512019" elapsed="0.023633"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.535856" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:11.535739" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:11.535719" 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-07T17:17:11.537231" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:11.537903" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:11.537592" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:11.538901" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:11.538471" elapsed="0.000456"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:11.538990" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:17:11.539144" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:11.538138" elapsed="0.001031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:11.539694" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:11.539323" elapsed="0.000398"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:11.540249" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:11.539880" elapsed="0.000396"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:11.540667" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:11.553894" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:11.540435" elapsed="0.015268">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.555923" 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-07T17:17:11.556111" 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-07T17:17:11.556273" 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-07T17:17:11.556435" 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-07T17:17:11.556601" 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-07T17:17:11.556760" 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-07T17:17:11.557042" 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-07T17:17:11.557211" 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-07T17:17:11.557367" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:11.556903" elapsed="0.000516"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.556830" 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-07T17:17:11.557583" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.557640" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.536680" elapsed="0.021073">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:11.557865" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:11.557908" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:11.536081" elapsed="0.021850"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:11.558575" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.558258" elapsed="0.000376">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:11.558027" elapsed="0.000668">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:11.558009" elapsed="0.000718">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.558772" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.511458" elapsed="0.047412">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.559058" 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-07T17:17:11.559222" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.559283" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:11.509044" elapsed="0.050337">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:11.559579" 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-07T17:17:11.559752" 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-07T17:17:11.559919" 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-07T17:17:11.560092" 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-07T17:17:11.560256" 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-07T17:17:11.560417" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:11.560477" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:11.506300" elapsed="0.054276">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:12.589685" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:12.589198" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:12.590227" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:12.589893" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:12.590300" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:17:12.590477" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:12.588798" 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-07T17:17:12.595346" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:12.595153" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:12.595756" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.595521" elapsed="0.000309">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596031" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596236" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596390" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596550" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596725" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.596888" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.597076" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.597233" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.606962" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.607258" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.616982" 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-07T17:17:12.617175" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.617242" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.594597" elapsed="0.022765">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:12.617474" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:12.617517" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:12.594036" elapsed="0.023503"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.617745" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:12.617628" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:12.617607" 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-07T17:17:12.619131" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:12.619801" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:12.619490" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:12.620651" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:12.620388" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:12.620724" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:12.620869" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:12.620053" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:12.621428" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:12.621063" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:12.621943" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:12.621605" elapsed="0.000380"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:12.622373" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:12.636588" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:12.622142" elapsed="0.016431">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.638755" 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-07T17:17:12.638930" 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-07T17:17:12.639111" 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-07T17:17:12.639274" 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-07T17:17:12.639441" 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-07T17:17:12.639599" 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-07T17:17:12.639910" 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-07T17:17:12.640118" 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-07T17:17:12.640277" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:12.639781" elapsed="0.000548"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.639704" 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-07T17:17:12.640495" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.640552" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.618579" elapsed="0.022080">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:12.640773" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:12.640817" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:12.617959" elapsed="0.022882"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:12.641748" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.641308" elapsed="0.000522">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:12.640963" elapsed="0.000953">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:12.640932" elapsed="0.001028">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.642064" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.593473" elapsed="0.048729">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.642439" 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-07T17:17:12.642663" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.642748" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:12.590800" elapsed="0.052084">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.643139" 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-07T17:17:12.643382" 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-07T17:17:12.643609" 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-07T17:17:12.643827" 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-07T17:17:12.644217" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:12.644449" elapsed="0.000076"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:12.644587" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:12.587790" elapsed="0.056936">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:13.673015" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:13.672510" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:13.673536" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:13.673220" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:13.673611" elapsed="0.000084"/>
</return>
<msg time="2026-04-07T17:17:13.673835" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:13.672116" 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-07T17:17:13.678404" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:13.678215" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:13.678812" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.678577" elapsed="0.000555">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.679298" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.679501" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.679657" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.679816" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.680007" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.680169" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.680338" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.680492" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.690381" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.690576" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.700277" 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-07T17:17:13.700465" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.700598" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.677660" elapsed="0.023056">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:13.700829" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:13.700872" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:13.677091" elapsed="0.023804"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.701117" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:13.700999" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:13.700962" 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-07T17:17:13.702492" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:13.703172" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:13.702848" elapsed="0.000349"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:13.703982" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:13.703708" elapsed="0.000301"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:13.704056" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:13.704204" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:13.703377" elapsed="0.000851"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:13.704746" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:13.704382" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:13.705282" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:13.704923" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:13.705722" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:13.718619" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:13.705464" elapsed="0.017847">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.723714" elapsed="0.000049"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.724143" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.724506" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.724861" 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-07T17:17:13.725266" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.725618" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.726243" 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-07T17:17:13.726613" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.726954" elapsed="0.000074"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:13.725937" elapsed="0.001165"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.725782" elapsed="0.001380"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.727465" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.727595" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.701940" elapsed="0.026053">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:13.728256" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:13.728352" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:13.701331" elapsed="0.027072"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:13.729827" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.729084" elapsed="0.000876">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:13.728586" elapsed="0.001494">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:13.728547" elapsed="0.001566">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.730158" elapsed="0.000218"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.676534" elapsed="0.053931">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.730639" 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-07T17:17:13.730800" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.730861" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:13.674174" elapsed="0.056783">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:13.731134" 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-07T17:17:13.731306" 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-07T17:17:13.731468" 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-07T17:17:13.731624" 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-07T17:17:13.731782" 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-07T17:17:13.731939" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:13.732014" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:13.671357" elapsed="0.060761">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:14.763178" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:14.762647" elapsed="0.000566"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.763716" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:14.763397" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:14.763792" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:17:14.763988" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:14.762121" elapsed="0.001896"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:14.768606" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:14.768410" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:14.769035" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.768781" elapsed="0.000338">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.769283" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.769505" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.769666" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.769823" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.770014" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.770175" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.770348" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.770502" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.780678" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.780879" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.790719" 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-07T17:17:14.790914" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.790995" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.767853" elapsed="0.023270">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:14.791247" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:14.791320" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.767269" elapsed="0.024074"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.791595" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.791439" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.791417" elapsed="0.000250"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:14.793023" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.793727" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:14.793408" elapsed="0.000346"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:14.794570" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:14.794292" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:14.794644" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:14.794792" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:14.793937" elapsed="0.000879"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.795372" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:14.794984" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.795912" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:14.795562" elapsed="0.000375"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:14.796353" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:14.810915" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:14.796115" elapsed="0.018319">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.814836" 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-07T17:17:14.815240" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.815621" 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-07T17:17:14.816008" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.816385" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.816733" 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-07T17:17:14.817358" 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-07T17:17:14.817728" 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-07T17:17:14.818103" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:14.817076" elapsed="0.001147"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.816883" elapsed="0.001402"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.818585" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.818716" elapsed="0.000031"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.792460" elapsed="0.026493">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:14.819239" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:14.819385" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.791818" elapsed="0.027622"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.820563" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.820201" elapsed="0.000421">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:14.819701" elapsed="0.000982">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:14.819659" elapsed="0.001056">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.820760" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.766682" elapsed="0.054175">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.821044" 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-07T17:17:14.821208" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.821269" 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 ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:14.764317" elapsed="0.057050">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.821528" 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-07T17:17:14.821699" 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-07T17:17:14.821863" 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-07T17:17:14.822033" 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-07T17:17:14.822195" 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-07T17:17:14.822356" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.822416" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:14.761222" elapsed="0.061290">Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<msg time="2026-04-07T17:17:14.822612" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.061855" elapsed="20.760848">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.822777" elapsed="0.000015"/>
</return>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:16:54.059726" elapsed="20.763149">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</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-07T17:17:14.823118" elapsed="0.000022"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:16:53.715916" elapsed="21.107371">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d</status>
</test>
<test id="s1-s1-s1-t30" name="Create Bridge Manually and Verify After Recover" line="150">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:14.826801" elapsed="0.000228"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:14.826544" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.828078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.827954" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.827935" 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-07T17:17:14.832680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.832576" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.832557" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.833721" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:14.833347" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.834221" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:14.833899" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:14.834291" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:14.834444" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:14.832962" elapsed="0.001507"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.839680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.839571" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.839552" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.841003" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.840873" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.840856" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:14.841586" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:14.841222" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:14.842047" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:14.841766" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:14.873469" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:14.842614" elapsed="0.031016"/>
</kw>
<msg time="2026-04-07T17:17:14.873802" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:14.873848" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.842233" elapsed="0.031652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:14.933782" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:14.874482" elapsed="0.059536"/>
</kw>
<msg time="2026-04-07T17:17:14.934206" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:14.934255" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.874091" elapsed="0.060201"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.934637" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:14.934383" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.934357" elapsed="0.000439"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:14.935383" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:14.934938" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.935768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:14.935554" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.935536" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:14.935902" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:14.938304" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:14.939794" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:14.941241" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:14.936809" elapsed="0.004828"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:14.936211" elapsed="0.005540"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:14.840572" elapsed="0.101279"/>
</kw>
<msg time="2026-04-07T17:17:14.941943" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:14.942002" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.839894" elapsed="0.102147"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:14.942226" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:17:14.942118" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.942099" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.942708" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.943073" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.943144" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:14.839219" elapsed="0.104031"/>
</kw>
<msg time="2026-04-07T17:17:14.943342" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:14.943385" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.834840" elapsed="0.108581"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:14.943748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:14.943506" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.943489" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:14.834703" elapsed="0.109144"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.949136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.949028" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.949009" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:14.950389" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:14.950282" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:14.950265" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:14.950953" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:14.950594" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:14.951457" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:14.951147" elapsed="0.000347"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:14.989998" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:14.952045" elapsed="0.038111"/>
</kw>
<msg time="2026-04-07T17:17:14.990344" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:14.990390" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.951651" elapsed="0.038775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.061240" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:14.990996" elapsed="0.070440"/>
</kw>
<msg time="2026-04-07T17:17:15.061605" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:15.061650" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.990592" elapsed="0.071093"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.062004" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.061760" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.061741" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.062615" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.062244" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.063155" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.062761" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.062743" elapsed="0.000514"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:15.063290" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.065581" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:15.067030" elapsed="0.000545"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:15.068520" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:15.064142" elapsed="0.004767"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:15.063543" elapsed="0.005501"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:14.949957" elapsed="0.119188"/>
</kw>
<msg time="2026-04-07T17:17:15.069235" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:15.069277" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.949348" elapsed="0.119965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:15.069492" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:15.069388" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.069369" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.069949" elapsed="0.000041"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.070293" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.070364" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:14.948675" elapsed="0.121832"/>
</kw>
<msg time="2026-04-07T17:17:15.070599" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:15.070642" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.944232" elapsed="0.126444"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.071006" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.070750" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.070733" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:14.944093" elapsed="0.127013"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.076118" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:15.076009" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.075966" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.077361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:15.077250" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.077233" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:15.077911" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:15.077563" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.078355" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:15.078108" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.111364" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:15.078906" elapsed="0.032620"/>
</kw>
<msg time="2026-04-07T17:17:15.111694" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:15.111758" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:15.078533" elapsed="0.033260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.178840" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:15.112435" elapsed="0.066720"/>
</kw>
<msg time="2026-04-07T17:17:15.179412" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:15.179479" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:15.111959" elapsed="0.067574"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.180040" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.179650" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.179618" elapsed="0.000573"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.180723" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.180348" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.181101" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.180873" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.180855" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:15.181234" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.185919" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:17:15.187376" elapsed="0.000532"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:15.188814" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:15.182082" elapsed="0.007134"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:15.181496" elapsed="0.007831"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:15.076938" elapsed="0.112489"/>
</kw>
<msg time="2026-04-07T17:17:15.189518" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:15.189561" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:15.076333" elapsed="0.113266"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:15.189782" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:15.189677" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.189657" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.190266" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.190596" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.190667" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:15.075626" elapsed="0.115147"/>
</kw>
<msg time="2026-04-07T17:17:15.190863" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:15.190906" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:15.071363" elapsed="0.119579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.191282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.191041" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.191023" elapsed="0.000334"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:15.071224" elapsed="0.120156"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:14.834530" elapsed="0.356881"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:14.832204" elapsed="0.359261"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:14.827667" elapsed="0.363850"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:14.827226" elapsed="0.364334"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:14.824565" elapsed="0.367045"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:17:15.199562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.199303" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.199285" elapsed="0.000357"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.199937" 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-07T17:17:15.200086" 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-07T17:17:15.199784" elapsed="0.000329"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.200635" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:17:15.200258" elapsed="0.000422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.201255" level="INFO">${conn_id} = 145</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-07T17:17:15.200832" elapsed="0.000449"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.202224" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:15.202299" 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-07T17:17:15.201915" elapsed="0.000408"/>
</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-07T17:17:15.202475" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.203632" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:15.876776" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:16:48 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:15.203319" elapsed="0.673637"/>
</kw>
<msg time="2026-04-07T17:17:15.877060" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.202952" elapsed="0.674190"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:15.201526" elapsed="0.675729"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:15.877759" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:17:15.911137" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:15.911387" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:15.911484" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:15.877498" elapsed="0.034035"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:15.911891" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.913721" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.913101" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.914316" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:15.914019" elapsed="0.000406"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.913935" elapsed="0.000543"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:15.914823" elapsed="0.000079"/>
</return>
<status status="PASS" start="2026-04-07T17:17:15.914595" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.914562" elapsed="0.000500"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.915138" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.920250" elapsed="0.000331"/>
</kw>
<kw name="Open 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-07T17:17:15.920745" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:15.921062" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:15.915827" elapsed="0.005385"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:15.198736" elapsed="0.722569"/>
</kw>
<msg time="2026-04-07T17:17:15.921359" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.198184" elapsed="0.723226"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:15.197675" elapsed="0.723819"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.922022" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:15.921676" elapsed="0.000373"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.922515" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:15.922221" elapsed="0.000320"/>
</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-07T17:17:15.932260" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:15.931858" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.932748" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:15.932444" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:15.932817" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:15.932974" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:15.931483" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.938328" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:15.938030" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:15.938405" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:15.938551" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:15.937673" elapsed="0.000903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.944948" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.944699" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.945407" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.945163" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:15.953808" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:15.953950" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:15.954089" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:15.947441" elapsed="0.006675"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.945517" elapsed="0.008640"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.954335" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.954183" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.945498" elapsed="0.008947"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.959187" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.955911" elapsed="0.003343"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.955609" elapsed="0.003692"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.955584" elapsed="0.003767"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.962893" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.959729" elapsed="0.003228"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.959428" elapsed="0.003597"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.959405" elapsed="0.003656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.963905" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:15.963277" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.964381" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.964064" elapsed="0.000374"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.964911" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:15.964616" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.964462" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.964038" elapsed="0.000976"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.965859" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:15.965165" elapsed="0.000720"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.966269" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:15.966027" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.966802" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:15.966506" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.966353" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.966007" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:15.967048" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:15.967877" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:15.967575" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:15.968076" elapsed="0.002140"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:15.954973" elapsed="0.015305"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:15.970452" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:15.970347" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.970328" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:15.970678" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:15.970747" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:17:15.973085" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:15.938907" elapsed="0.034207"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:15.973167" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:15.973316" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:15.937194" elapsed="0.036147"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.974527" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:15.974140" elapsed="0.000456"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:15.973971" elapsed="0.000665"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:15.973833" elapsed="0.000835"/>
</for>
<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="PASS" start="2026-04-07T17:17:15.973567" elapsed="0.001154"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:15.933231" elapsed="0.041523"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.980180" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:15.979861" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:15.980252" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:15.980398" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:15.979481" elapsed="0.000941"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.986622" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.986375" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:15.987071" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:15.986814" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:16.002906" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:16.003032" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:16.003127" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:15.989119" elapsed="0.014082"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:15.987182" elapsed="0.016063"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.003515" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.003271" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:15.987163" elapsed="0.016540"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.011123" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.006016" elapsed="0.005212"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.005501" elapsed="0.005804"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.005461" elapsed="0.005900"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.014508" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.012053" elapsed="0.002509"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.011483" elapsed="0.003113"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.011446" elapsed="0.003175"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.015206" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.014786" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.015536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.015304" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.016103" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.015774" elapsed="0.000355"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.015618" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.015285" elapsed="0.000904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.016735" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.016341" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.017076" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.016831" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.017638" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.017311" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.017158" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.016813" elapsed="0.000906"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.017867" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:16.018681" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.018390" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.018857" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:16.004535" elapsed="0.016775"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:16.021488" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.021381" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.021363" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.021721" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.021791" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:17:16.023997" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:15.980743" elapsed="0.043282"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:16.024077" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:16.024226" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:15.978990" elapsed="0.045261"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.025532" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:16.025152" elapsed="0.000447"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:16.024930" elapsed="0.000709"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:16.024792" elapsed="0.000879"/>
</for>
<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="PASS" start="2026-04-07T17:17:16.024524" elapsed="0.001200"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:15.974841" elapsed="0.050917"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.031002" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.030688" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:16.031076" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:16.031223" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.030347" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.037415" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.037171" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.037854" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.037613" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:16.050615" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:16.050761" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:16.050889" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:16.039910" elapsed="0.011014"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.037964" elapsed="0.013053"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.051265" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.051056" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.037945" elapsed="0.013439"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.057895" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.052809" elapsed="0.005223"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.052512" elapsed="0.005599"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.052486" elapsed="0.005682"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.062370" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.058773" elapsed="0.003642"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.058293" elapsed="0.004156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.058256" elapsed="0.004217"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.063010" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.062625" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.063336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.063107" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.063868" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.063571" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.063416" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.063089" elapsed="0.000861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.064501" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.064124" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.064824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.064597" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.065369" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.065078" elapsed="0.000361"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.064904" elapsed="0.000573"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.064579" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.065646" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:16.066442" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.066170" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.066616" elapsed="0.002149"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:16.051870" elapsed="0.016957"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:16.069019" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.068897" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.068879" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.069247" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.069318" elapsed="0.000018"/>
</return>
<msg time="2026-04-07T17:17:16.071633" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:16.031565" elapsed="0.040096"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:16.071712" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:16.071861" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:16.029845" elapsed="0.042041"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.073061" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:16.072676" elapsed="0.000450"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:16.072528" elapsed="0.000637"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:16.072384" elapsed="0.000811"/>
</for>
<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="PASS" start="2026-04-07T17:17:16.072122" elapsed="0.001123"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:16.025846" elapsed="0.047433"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:15.933081" elapsed="0.140227"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:15.930877" elapsed="0.142482"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:17:15.922783" elapsed="0.150632"/>
</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-07T17:17:16.083253" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:16.082857" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.083740" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:16.083440" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:16.083808" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:16.083958" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:16.082494" elapsed="0.001506"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.089270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.088957" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:16.089342" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:16.089491" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.088609" elapsed="0.000944"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.095994" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.095733" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.096433" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.096192" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:16.106821" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:16.108783" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:16.108955" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:16.098519" elapsed="0.010490"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.096542" elapsed="0.012527"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.109313" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.109105" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.096524" elapsed="0.012909"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.114032" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.110807" elapsed="0.003314"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.110510" elapsed="0.003696"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.110484" elapsed="0.003760"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.117646" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.114633" elapsed="0.003058"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.114323" elapsed="0.003402"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.114299" elapsed="0.003450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.118291" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.117904" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.118614" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.118387" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.119162" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.118847" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.118694" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.118368" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.119751" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.119396" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.120087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.119845" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.120614" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.120320" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.120168" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.119827" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.120838" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:16.121641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.121366" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.121814" elapsed="0.002102"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:16.109906" elapsed="0.014086"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:16.124168" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.124063" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.124044" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.124396" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.124466" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:16.126674" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:16.089879" elapsed="0.036823"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:16.126752" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:16.126900" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:16.088130" elapsed="0.038796"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.128083" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:16.127697" elapsed="0.000463"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:16.127552" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:16.127418" elapsed="0.000810"/>
</for>
<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="PASS" start="2026-04-07T17:17:16.127159" elapsed="0.001119"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:16.084182" elapsed="0.044129"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.133741" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.133443" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:16.133812" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:16.133958" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.133043" elapsed="0.000956"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.140134" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.139870" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.140571" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.140327" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:16.155805" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:16.158523" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:16.158769" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:16.142588" elapsed="0.016237"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.140681" elapsed="0.018236"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.159334" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.159001" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.140662" elapsed="0.018861"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.166747" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.161736" elapsed="0.005104"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.161241" elapsed="0.005634"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.161201" elapsed="0.005699"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.169276" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.167190" elapsed="0.002131"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.166955" elapsed="0.002400"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.166938" elapsed="0.002441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.169905" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.169542" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.170245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.170018" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.170773" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.170477" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.170325" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.169998" elapsed="0.000856"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.171375" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.171020" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.171698" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.171474" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.172239" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.171928" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.171777" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.171455" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.172462" elapsed="0.000336"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:16.173237" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.172953" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.173408" elapsed="0.002259"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:16.160293" elapsed="0.015437"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:16.175902" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.175798" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.175780" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.176147" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.176231" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:16.178618" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:16.134317" elapsed="0.044329"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:16.178697" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:16.178845" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:16.132545" elapsed="0.046325"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.180195" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:16.179787" elapsed="0.000487"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:16.179591" elapsed="0.000723"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:16.179414" elapsed="0.000930"/>
</for>
<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="PASS" start="2026-04-07T17:17:16.179105" elapsed="0.001291"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:16.128440" elapsed="0.052028"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.185679" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.185369" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:16.185751" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:16.185897" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.185027" elapsed="0.000895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.192016" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.191756" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.192449" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.192209" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:16.205326" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:16.205579" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2497'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:16.205741" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:16.194468" elapsed="0.011326"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.192559" elapsed="0.013296"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.206125" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.205890" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.192540" elapsed="0.013705"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.211040" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.207626" elapsed="0.003541"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.207322" elapsed="0.003895"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.207297" elapsed="0.003954"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.214625" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.211629" elapsed="0.003041"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.211328" elapsed="0.003376"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.211305" elapsed="0.003423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.215272" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.214881" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.215597" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.215368" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.216138" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.215828" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.215677" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.215350" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.216726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.216371" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.217064" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.216821" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.217588" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:16.217299" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:16.217146" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.216802" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.217811" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:16.218604" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:16.218335" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.218775" elapsed="0.002097"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:16.206718" elapsed="0.014215"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:16.221120" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.221017" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.220997" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.221342" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.221410" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:16.223622" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:16.186260" elapsed="0.037390"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:16.223699" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:16.223845" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:16.184529" elapsed="0.039341"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.225016" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:16.224635" elapsed="0.000458"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:16.224491" elapsed="0.000641"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:16.224363" elapsed="0.000798"/>
</for>
<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="PASS" start="2026-04-07T17:17:16.224103" elapsed="0.001109"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:16.180559" elapsed="0.044719"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:16.084051" elapsed="0.141258"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:16.081922" elapsed="0.143438"/>
</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_operational}</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-07T17:17:16.073607" elapsed="0.151806"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:17:15.195599" elapsed="1.029879"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:17:14.823707" elapsed="1.401893"/>
</test>
<test id="s1-s1-s1-t31" name="Add Port Manually and Verify After Recover" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:16.228764" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:16.228510" 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-07T17:17:16.230008" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.229883" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.229865" elapsed="0.000233"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.234770" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.234664" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.234646" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.235814" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:16.235441" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.236309" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:16.236009" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:16.236378" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:16.236529" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:16.235074" elapsed="0.001479"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.241561" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.241454" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.241436" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.242849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.242743" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.242726" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:16.243437" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.243080" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.243862" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:16.243616" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.275624" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:16.244437" elapsed="0.031360"/>
</kw>
<msg time="2026-04-07T17:17:16.276006" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:16.276055" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.244058" elapsed="0.032033"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.336566" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:16.276653" elapsed="0.060107"/>
</kw>
<msg time="2026-04-07T17:17:16.336925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:16.337039" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.276259" elapsed="0.060818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.337379" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.337158" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.337135" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.338000" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.337615" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.338357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.338149" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.338130" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:16.338494" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.340829" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:17:16.342313" elapsed="0.000613"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:16.343884" elapsed="0.000342"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.339342" elapsed="0.004955"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:16.338745" elapsed="0.005669"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:16.242443" elapsed="0.102069"/>
</kw>
<msg time="2026-04-07T17:17:16.344603" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.344645" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.241772" elapsed="0.102908"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:16.344861" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.344756" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.344738" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.345344" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.345666" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.345735" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:16.241124" elapsed="0.104717"/>
</kw>
<msg time="2026-04-07T17:17:16.345931" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.345988" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.236900" elapsed="0.109125"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.346342" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.346100" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.346083" elapsed="0.000334"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:16.236766" elapsed="0.109673"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.351471" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.351365" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.351346" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.352719" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.352613" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.352596" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:16.353338" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.352970" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.353765" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:16.353522" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.388949" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:16.354341" elapsed="0.034808"/>
</kw>
<msg time="2026-04-07T17:17:16.389323" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:16.389370" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.353946" elapsed="0.035459"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.471117" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:16.389995" elapsed="0.081486"/>
</kw>
<msg time="2026-04-07T17:17:16.471743" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:16.471791" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.389583" elapsed="0.082245"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.472376" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.471963" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.471919" elapsed="0.000574"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.473153" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.472640" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.473523" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.473308" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.473289" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:16.473659" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.476229" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:17:16.477750" elapsed="0.000531"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:16.479223" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.474651" elapsed="0.004986"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:16.474008" elapsed="0.005746"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:16.352315" elapsed="0.127543"/>
</kw>
<msg time="2026-04-07T17:17:16.479958" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.480023" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.351690" elapsed="0.128370"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:16.480294" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.480143" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.480122" elapsed="0.000265"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.480837" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.483907" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.484000" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:16.351003" elapsed="0.133115"/>
</kw>
<msg time="2026-04-07T17:17:16.484213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.484269" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.346689" elapsed="0.137620"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.484640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.484385" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.484368" elapsed="0.000349"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:16.346555" elapsed="0.138186"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.490247" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.490139" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.490120" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.491513" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:16.491408" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.491390" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:16.492107" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.491720" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.492558" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:16.492288" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.523552" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:16.493135" elapsed="0.030596"/>
</kw>
<msg time="2026-04-07T17:17:16.523899" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:16.523944" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.492738" elapsed="0.031260"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.595754" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:16.524558" elapsed="0.071390"/>
</kw>
<msg time="2026-04-07T17:17:16.596146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:16.596192" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.524167" elapsed="0.072060"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.596532" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.596305" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.596285" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.597182" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.596772" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.597559" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.597351" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.597333" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:16.597689" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.600120" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:16.601595" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:16.603054" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:16.598659" elapsed="0.004789"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:16.598073" elapsed="0.005492"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:16.491109" elapsed="0.112555"/>
</kw>
<msg time="2026-04-07T17:17:16.603756" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.603799" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.490463" elapsed="0.113373"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:16.604034" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:16.603911" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.603893" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.604514" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.604864" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:16.604934" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:16.489754" elapsed="0.115321"/>
</kw>
<msg time="2026-04-07T17:17:16.605168" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:16.605211" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.485075" elapsed="0.120172"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:16.605581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.605338" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.605304" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:16.484874" elapsed="0.120806"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:16.236603" elapsed="0.369108"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:16.234299" elapsed="0.371470"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:16.229602" elapsed="0.376225"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:16.229189" elapsed="0.376684"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:16.226557" elapsed="0.379369"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:17:16.614133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:16.613856" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:16.613838" elapsed="0.000375"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.614499" 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-07T17:17:16.614599" 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-07T17:17:16.614357" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.615168" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:17:16.614772" elapsed="0.000476"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.615775" level="INFO">${conn_id} = 150</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-07T17:17:16.615401" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:16.616708" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:16.616783" 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-07T17:17:16.616419" elapsed="0.000388"/>
</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-07T17:17:16.616959" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.618168" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:16.944127" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:15 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:16.617836" elapsed="0.326452"/>
</kw>
<msg time="2026-04-07T17:17:16.944388" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.617483" elapsed="0.326988"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:16.616030" elapsed="0.328555"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:16.945130" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:17:16.998003" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:16.998256" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:16.998352" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:16.944842" elapsed="0.053565"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:16.998762" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.000355" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:16.999689" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.000966" elapsed="0.000069"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.000637" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.000583" elapsed="0.000580"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:17.001525" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.001282" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.001248" elapsed="0.000478"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.001799" elapsed="0.000030"/>
</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-07T17:17:17.006844" elapsed="0.000352"/>
</kw>
<kw name="Open 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-07T17:17:17.007361" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.007672" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.002970" elapsed="0.004849"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:16.613317" elapsed="0.394590"/>
</kw>
<msg time="2026-04-07T17:17:17.007961" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:16.612663" elapsed="0.395369"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:16.612163" elapsed="0.396013"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.008678" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.008355" elapsed="0.000349"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.009201" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.008879" elapsed="0.000348"/>
</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-07T17:17:17.019798" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:17.019399" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.020311" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:17.020005" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:17.020380" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.020532" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:17.019024" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.026115" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.025791" elapsed="0.000351"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.026188" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.026334" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.025363" elapsed="0.000995"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.032583" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.032333" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.033034" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.032775" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.041414" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.041562" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.041675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.035208" elapsed="0.006493"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.033156" elapsed="0.008586"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.041920" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.041769" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.033137" elapsed="0.008894"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.045330" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.043046" elapsed="0.002330"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.042807" elapsed="0.002603"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.042789" elapsed="0.002645"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.048786" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.045808" elapsed="0.003040"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.045498" elapsed="0.003397"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.045478" elapsed="0.003451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.049796" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.049171" elapsed="0.000662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.050293" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.049929" elapsed="0.000510"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.051145" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.050701" elapsed="0.000481"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.050478" elapsed="0.000753"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.049904" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.052005" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.051475" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.052462" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.052142" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.053229" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.052787" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.052575" elapsed="0.000771"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.052116" elapsed="0.001262"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.053602" elapsed="0.000393"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.054464" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.054158" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.054645" elapsed="0.002122"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.042388" elapsed="0.014441"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.057019" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.056897" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.056879" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.057248" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.057335" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:17:17.059458" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.026698" elapsed="0.032786"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.059535" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:17.059681" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:17.024747" elapsed="0.034958"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.060881" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.060493" elapsed="0.000458"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.060345" elapsed="0.000662"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.060213" elapsed="0.000827"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.059934" elapsed="0.001160"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:17.020776" elapsed="0.040352"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.066342" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.066043" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.066413" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:17.066559" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.065689" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.072928" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.072681" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.073381" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.073140" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.089776" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.090077" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.090294" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.075573" elapsed="0.014779"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.073505" elapsed="0.016944"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.090848" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.090508" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.073485" elapsed="0.017597"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.098562" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.093376" elapsed="0.005305"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.092851" elapsed="0.005874"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.092810" elapsed="0.005941"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.101162" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.099046" elapsed="0.002161"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.098808" elapsed="0.002433"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.098791" elapsed="0.002475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.101814" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.101421" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.102159" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.101911" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.102697" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.102396" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.102241" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.101893" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.103316" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.102931" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.103660" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.103427" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.104212" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.103896" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.103742" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.103408" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.104439" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.105241" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.104940" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.105416" elapsed="0.002167"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.091864" elapsed="0.015788"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.107827" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.107721" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.107703" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.108073" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.108144" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:17.110281" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.066905" elapsed="0.043449"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.110409" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.110563" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:17.065196" elapsed="0.045394"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.111760" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.111383" elapsed="0.000443"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.111237" elapsed="0.000630"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.111102" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.110815" elapsed="0.001135"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:17.061215" elapsed="0.050787"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.117351" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.117050" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.117423" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.117570" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.116696" elapsed="0.000898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.123741" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.123488" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.124195" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.123934" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.140353" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.140457" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.140561" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.126202" elapsed="0.014390"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.124305" elapsed="0.016376"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.141158" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.140746" elapsed="0.000559"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.124287" elapsed="0.017065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.148605" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.143614" elapsed="0.005094"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.143130" elapsed="0.005653"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.143090" elapsed="0.005748"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.152320" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.149480" elapsed="0.002885"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.148959" elapsed="0.003439"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.148922" elapsed="0.003501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.152941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.152576" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.153284" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.153055" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.153813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.153516" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.153364" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.153037" elapsed="0.000894"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.154482" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.154107" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.154808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.154578" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.155356" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.155061" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.154889" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.154560" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.155582" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.156368" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.156098" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.156542" elapsed="0.002269"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.142167" elapsed="0.016707"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.159065" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.158943" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.158924" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.159292" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.159362" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:17.161481" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.117933" elapsed="0.043575"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.161559" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:17.161712" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:17.116207" elapsed="0.045529"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.162888" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.162520" elapsed="0.000431"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.162374" elapsed="0.000634"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.162232" elapsed="0.000806"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.161955" elapsed="0.001134"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:17.112090" elapsed="0.051033"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:17.020623" elapsed="0.142528"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:17.018335" elapsed="0.144867"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:17:17.009404" elapsed="0.153852"/>
</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-07T17:17:17.172900" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:17.172522" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.173399" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:17.173099" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:17.173468" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:17.173617" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:17.172156" elapsed="0.001485"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.178993" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.178681" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.179066" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:17.179212" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.178327" elapsed="0.000909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.185722" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.185472" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.186180" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.185916" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.195808" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.196672" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.196852" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.188195" elapsed="0.008692"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.186293" elapsed="0.010653"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.197214" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.197005" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.186274" elapsed="0.011059"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.201952" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.198740" elapsed="0.003378"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.198413" elapsed="0.003755"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.198388" elapsed="0.003815"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.205552" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.202585" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.202280" elapsed="0.003382"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.202256" elapsed="0.003440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.206443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.205908" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.206937" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.206577" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.207736" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.207290" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.207076" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.206552" elapsed="0.001272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.208354" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.207991" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.208673" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.208448" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.209218" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.208905" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.208754" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.208430" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.209444" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.210241" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.209943" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.210416" elapsed="0.002134"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.197809" elapsed="0.014802"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.212784" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.212680" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.212661" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.213028" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.213099" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:17.215353" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.179554" elapsed="0.035828"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.215431" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.215579" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:17.177832" elapsed="0.037773"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.216749" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.216381" elapsed="0.000445"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.216233" elapsed="0.000631"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.216102" elapsed="0.000792"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.215823" elapsed="0.001121"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:17.173865" elapsed="0.043164"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.222405" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.222110" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.222476" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.222620" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.221756" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.228760" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.228514" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.229208" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.228953" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.243800" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.244924" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.245207" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.231230" elapsed="0.014034"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.229318" elapsed="0.016040"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.245742" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.245414" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.229300" elapsed="0.016628"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.251273" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.248055" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.247722" elapsed="0.003733"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.247696" elapsed="0.003794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.254813" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.251869" elapsed="0.003006"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.251567" elapsed="0.003356"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.251543" elapsed="0.003414"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.255784" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.255239" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.256130" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.255881" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.256657" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.256362" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.256211" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.255863" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.257271" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.256889" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.257591" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.257367" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.258133" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.257822" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.257671" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.257349" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.258358" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.259156" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.258859" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.259331" elapsed="0.002253"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.246717" elapsed="0.014929"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.261819" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.261715" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.261697" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.262061" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.262132" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:17.264360" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.223001" elapsed="0.041387"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.264438" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:17.264585" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:17.221269" elapsed="0.043341"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.265757" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.265381" elapsed="0.000453"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.265236" elapsed="0.000638"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.265107" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.264827" elapsed="0.001127"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:17.217122" elapsed="0.048915"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.271222" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.270887" elapsed="0.000362"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:17.271295" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:17.271440" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.270552" elapsed="0.000912"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.277553" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.277311" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.277997" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.277743" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:17.292200" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:17.292639" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2768'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:17.292885" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:17.280021" elapsed="0.012920"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.278108" elapsed="0.014962"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.293462" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.293128" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.278089" elapsed="0.015559"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.301189" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.295900" elapsed="0.005421"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.295416" elapsed="0.005955"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.295374" elapsed="0.006032"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.304742" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.301786" elapsed="0.003019"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.301483" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.301460" elapsed="0.003427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.305638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.305125" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.306114" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.305772" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.306853" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.306440" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.306228" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.305747" elapsed="0.001241"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.307738" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.307202" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.308211" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.307871" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.308916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:17.308538" elapsed="0.000404"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:17.308323" elapsed="0.000669"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.307846" elapsed="0.001169"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.309158" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:17.309922" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:17.309655" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.310112" elapsed="0.002132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:17.294427" elapsed="0.017884"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:17.312488" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.312382" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.312363" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.312719" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.312789" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:17.315013" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:17.271781" elapsed="0.043261"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:17.315093" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:17.315241" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:17.270075" elapsed="0.045192"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.316472" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:17.316093" elapsed="0.000458"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:17:17.315924" elapsed="0.000666"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:17.315792" elapsed="0.000828"/>
</for>
<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="PASS" start="2026-04-07T17:17:17.315491" elapsed="0.001180"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:17.266129" elapsed="0.050613"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:17.173730" elapsed="0.143044"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:17.171581" elapsed="0.145244"/>
</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_operational}</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-07T17:17:17.163448" elapsed="0.153431"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:17:16.610149" elapsed="0.706796"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:17:16.225929" elapsed="1.091167"/>
</test>
<test id="s1-s1-s1-t32" name="Create Tap Device After Recover" line="158">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:17.320642" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:17.320383" 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-07T17:17:17.322115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.322003" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.321984" 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-07T17:17:17.326889" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.326784" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.326766" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.327948" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:17.327561" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.328449" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:17.328147" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:17.328519" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:17.328672" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:17.327193" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.333768" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.333661" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.333643" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.335076" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.334942" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.334924" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:17.335637" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.335281" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.336109" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:17.335834" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.367365" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:17.336664" elapsed="0.030872"/>
</kw>
<msg time="2026-04-07T17:17:17.367707" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:17.367753" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.336288" elapsed="0.031500"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.429388" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:17.368397" elapsed="0.061176"/>
</kw>
<msg time="2026-04-07T17:17:17.429741" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:17.429824" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.368012" elapsed="0.061851"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.430194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.429940" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.429920" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.430801" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.430435" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.431180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.430950" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.430932" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:17.431310" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.433613" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:17:17.435060" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.436468" elapsed="0.002194"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.432160" elapsed="0.006572"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:17.431570" elapsed="0.007275"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:17.334644" elapsed="0.104307"/>
</kw>
<msg time="2026-04-07T17:17:17.439075" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.439119" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.333997" elapsed="0.105159"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:17.439337" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.439232" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.439213" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.439804" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.440146" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.440217" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:17.333327" elapsed="0.106996"/>
</kw>
<msg time="2026-04-07T17:17:17.440413" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.440456" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.329061" elapsed="0.111448"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.440826" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.440583" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.440566" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:17.328909" elapsed="0.112015"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.446087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.445962" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.445944" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.447384" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.447279" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.447261" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:17.447996" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.447625" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.448418" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:17.448176" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.480437" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:17.449016" elapsed="0.031589"/>
</kw>
<msg time="2026-04-07T17:17:17.480770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:17.480835" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.448616" elapsed="0.032257"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.535132" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:17.481439" elapsed="0.053892"/>
</kw>
<msg time="2026-04-07T17:17:17.535507" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:17.535552" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.481055" elapsed="0.054533"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.535904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.535671" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.535650" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.536555" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.536170" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.536914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.536703" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.536686" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:17.537066" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.539405" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.540834" elapsed="0.000529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.542273" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.537947" elapsed="0.004717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:17.537361" elapsed="0.005416"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:17.446900" elapsed="0.095977"/>
</kw>
<msg time="2026-04-07T17:17:17.542970" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.543029" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.446299" elapsed="0.096767"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:17.543250" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.543144" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.543126" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.543726" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.544317" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.544391" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:17.445629" elapsed="0.098871"/>
</kw>
<msg time="2026-04-07T17:17:17.544593" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.544636" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.441196" elapsed="0.103476"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.545021" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.544746" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.544729" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:17.441061" elapsed="0.104063"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.550390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.550283" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.550265" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.551628" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.551521" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.551504" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:17.552204" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.551831" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.552628" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:17.552384" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.588068" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:17.553258" elapsed="0.034984"/>
</kw>
<msg time="2026-04-07T17:17:17.588408" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:17.588453" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.552808" elapsed="0.035682"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.636851" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:17.589061" elapsed="0.047996"/>
</kw>
<msg time="2026-04-07T17:17:17.637227" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:17.637272" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.588654" elapsed="0.048654"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.637602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.637384" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.637365" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.638274" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.637839" elapsed="0.000518"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.638633" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.638423" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.638405" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:17.638764" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.641075" elapsed="0.000500"/>
</kw>
<kw name="Open 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-07T17:17:17.642510" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.643883" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.639643" elapsed="0.004643"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:17.639037" elapsed="0.005359"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:17.551223" elapsed="0.093273"/>
</kw>
<msg time="2026-04-07T17:17:17.644586" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.644629" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.550600" elapsed="0.094066"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:17.644848" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.644743" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.644724" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.645325" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.645652" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.645723" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:17.549749" elapsed="0.096080"/>
</kw>
<msg time="2026-04-07T17:17:17.645920" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:17.645967" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.545397" elapsed="0.100634"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:17.646389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.646142" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.646124" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:17.545249" elapsed="0.101246"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:17.328747" elapsed="0.317777"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:17.326426" elapsed="0.320157"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:17.321703" elapsed="0.324938"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:17.321258" elapsed="0.325429"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:17.318248" elapsed="0.328493"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:17:17.649508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.649246" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.649228" elapsed="0.000360"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.649877" 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-07T17:17:17.650005" 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-07T17:17:17.649736" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.650576" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:17:17.650194" elapsed="0.000427"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.651330" level="INFO">${conn_id} = 155</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-07T17:17:17.650810" elapsed="0.000546"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.652294" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:17.652369" 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-07T17:17:17.652005" elapsed="0.000387"/>
</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-07T17:17:17.652545" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.653701" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:17.971542" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:16 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:17.653386" elapsed="0.318297"/>
</kw>
<msg time="2026-04-07T17:17:17.971761" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.653038" elapsed="0.318802"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:17.651572" elapsed="0.320379"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.972477" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:17:17.984955" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:17:17.985133" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:17.985195" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:17.972217" elapsed="0.013010"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.985451" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.986871" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:17.986264" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.987467" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:17.987181" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.987130" elapsed="0.000494"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:17.988003" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:17:17.987741" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.987708" elapsed="0.000482"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:17.988264" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.994251" elapsed="0.000320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:17.994732" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:17.995053" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:17.988998" elapsed="0.006203"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:17.648705" elapsed="0.346586"/>
</kw>
<msg time="2026-04-07T17:17:17.995344" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.647956" elapsed="0.347437"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:17.647467" elapsed="0.348005"/>
</kw>
<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-07T17:17:17.997632" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:17.997300" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:17.997280" elapsed="0.000433"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.998016" 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-07T17:17:17.998122" 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-07T17:17:17.997857" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:17.998675" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:17:17.998296" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:17.999259" level="INFO">${conn_id} = 157</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-07T17:17:17.998874" elapsed="0.000410"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.000192" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:18.000267" 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-07T17:17:17.999887" elapsed="0.000403"/>
</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-07T17:17:18.000443" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.001660" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:18.320610" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:17 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:18.001310" elapsed="0.319398"/>
</kw>
<msg time="2026-04-07T17:17:18.320773" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.000944" elapsed="0.319888"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:17.999496" elapsed="0.321429"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.321351" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:17:18.333787" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:17:18.334060" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:18.334160" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:18.321143" elapsed="0.013068"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:18.334565" elapsed="0.000944"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.336525" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:18.335900" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:18.337091" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:18.336785" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.336739" elapsed="0.000507"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:18.337591" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:17:18.337360" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.337328" elapsed="0.000446"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:18.337848" elapsed="0.000030"/>
</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-07T17:17:18.343681" elapsed="0.000475"/>
</kw>
<kw name="Open 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-07T17:17:18.344316" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:18.344612" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:18.338546" elapsed="0.006212"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:17.996742" elapsed="0.348156"/>
</kw>
<msg time="2026-04-07T17:17:18.344952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:17.996181" elapsed="0.348835"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:17.995667" elapsed="0.349429"/>
</kw>
<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-07T17:17:18.347152" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:18.346871" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.346853" elapsed="0.000380"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.347544" 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-07T17:17:18.347648" 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-07T17:17:18.347377" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.348223" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:17:18.347823" elapsed="0.000447"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.348801" level="INFO">${conn_id} = 159</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-07T17:17:18.348423" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.349715" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:18.349790" 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-07T17:17:18.349439" elapsed="0.000375"/>
</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-07T17:17:18.349969" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.351140" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:18.731546" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:18 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:18.350812" elapsed="0.380876"/>
</kw>
<msg time="2026-04-07T17:17:18.731770" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.350461" elapsed="0.381390"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:18.349054" elapsed="0.382913"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.732503" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:17:18.744831" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:17:18.745111" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:18.745212" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:18.732236" elapsed="0.013028"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:18.745627" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.747217" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:18.746564" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:18.747783" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:18.747491" elapsed="0.000545"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.747440" elapsed="0.000659"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:18.748468" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:17:18.748224" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.748188" elapsed="0.000466"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:18.748731" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.753325" elapsed="0.000453"/>
</kw>
<kw name="Open 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-07T17:17:18.754025" elapsed="0.000223"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:18.754467" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:18.749452" elapsed="0.005223"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:18.346349" elapsed="0.408454"/>
</kw>
<msg time="2026-04-07T17:17:18.754877" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.345778" elapsed="0.409166"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:18.345290" elapsed="0.409801"/>
</kw>
<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-07T17:17:18.758163" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:18.757775" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:18.757749" elapsed="0.000526"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.758709" 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-07T17:17:18.758882" 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-07T17:17:18.758517" elapsed="0.000409"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.759482" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:17:18.759102" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.760063" level="INFO">${conn_id} = 161</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-07T17:17:18.759678" elapsed="0.000411"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:18.761021" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:18.761099" 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-07T17:17:18.760702" elapsed="0.000422"/>
</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-07T17:17:18.761276" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:18.762455" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:19.091188" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:18 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:18.762125" elapsed="0.329167"/>
</kw>
<msg time="2026-04-07T17:17:19.091360" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.761755" elapsed="0.329668"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:18.760300" elapsed="0.331301"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.092035" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:17:19.105051" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:17:19.105206" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:19.105266" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:19.091799" elapsed="0.013500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.105521" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.106836" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.106243" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.107403" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.107135" elapsed="0.000371"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.107088" elapsed="0.000468"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:19.107901" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.107672" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.107639" elapsed="0.000482"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.108196" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.113932" elapsed="0.000339"/>
</kw>
<kw name="Open 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-07T17:17:19.114429" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.114752" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.108890" elapsed="0.006012"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:18.757045" elapsed="0.357964"/>
</kw>
<msg time="2026-04-07T17:17:19.115062" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:18.756246" elapsed="0.358863"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:18.755513" elapsed="0.359674"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:17:17.646968" elapsed="1.468278"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:17:17.317650" elapsed="1.797714"/>
</test>
<test id="s1-s1-s1-t33" name="Add Tap Device Manually and Verify After Recover" line="162">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:19.118615" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:19.118360" elapsed="0.000512"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.119854" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.119740" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.119721" 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-07T17:17:19.124502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.124397" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.124379" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.125572" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:19.125192" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.126108" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:19.125755" elapsed="0.000378"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:19.126177" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:19.126328" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:19.124787" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.131866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.131756" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.131736" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.133212" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.133105" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.133087" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:19.133813" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.133420" elapsed="0.000419"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.134279" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:19.134012" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.167207" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:19.134847" elapsed="0.032522"/>
</kw>
<msg time="2026-04-07T17:17:19.167562" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:19.167609" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.134458" elapsed="0.033186"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.236705" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:19.168243" elapsed="0.068670"/>
</kw>
<msg time="2026-04-07T17:17:19.237120" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:19.237166" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.167815" elapsed="0.069389"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.237537" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.237292" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.237269" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.238211" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.237797" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.238581" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.238369" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.238350" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:19.238714" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.241138" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:17:19.242604" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.243998" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.239619" elapsed="0.004771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:19.239021" elapsed="0.005481"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:19.132762" elapsed="0.111841"/>
</kw>
<msg time="2026-04-07T17:17:19.244695" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.244739" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.132099" elapsed="0.112677"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:19.245043" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.244913" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.244893" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.245525" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.245878" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.245954" elapsed="0.000043"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:19.131419" elapsed="0.114676"/>
</kw>
<msg time="2026-04-07T17:17:19.246189" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.246231" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.126786" elapsed="0.119482"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.246588" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.246343" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.246326" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:19.126645" elapsed="0.120046"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.252139" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.252029" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.252010" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.253385" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.253278" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.253260" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:19.253957" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.253587" elapsed="0.000504"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.254496" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:19.254247" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.286293" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:19.255072" elapsed="0.031378"/>
</kw>
<msg time="2026-04-07T17:17:19.286627" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:19.286673" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.254675" elapsed="0.032034"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.348379" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:19.287281" elapsed="0.061294"/>
</kw>
<msg time="2026-04-07T17:17:19.348746" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:19.348791" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.286874" elapsed="0.061953"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.349150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.348906" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.348885" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.349761" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.349392" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.350188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.349955" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.349936" elapsed="0.000371"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:19.350341" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.352627" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.354090" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.355502" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.351187" elapsed="0.004724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:19.350593" elapsed="0.005449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:19.252961" elapsed="0.103182"/>
</kw>
<msg time="2026-04-07T17:17:19.356234" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.356278" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.252352" elapsed="0.103963"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:19.356500" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.356393" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.356374" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.356964" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.357307" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.357377" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:19.251667" elapsed="0.105816"/>
</kw>
<msg time="2026-04-07T17:17:19.357573" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.357617" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.246961" elapsed="0.110692"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.358005" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.357726" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.357709" elapsed="0.000375"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:19.246822" elapsed="0.111285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.363459" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.363351" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.363332" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.364710" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.364603" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.364586" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:19.365281" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.364914" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.365700" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:19.365458" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.396590" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:19.366344" elapsed="0.030512"/>
</kw>
<msg time="2026-04-07T17:17:19.397343" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:19.397394" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.365877" elapsed="0.031560"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.458525" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:19.398243" elapsed="0.060487"/>
</kw>
<msg time="2026-04-07T17:17:19.458902" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:19.458964" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.397700" elapsed="0.061327"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.459397" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.459133" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.459101" elapsed="0.000406"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.460059" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.459650" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.460425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.460213" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.460195" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:19.460562" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.463130" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:17:19.464600" elapsed="0.000546"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.466134" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.461533" elapsed="0.005005"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:19.460890" elapsed="0.005762"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:19.364306" elapsed="0.102448"/>
</kw>
<msg time="2026-04-07T17:17:19.466850" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.466895" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.363675" elapsed="0.103257"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:19.467172" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.467062" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.467041" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.467664" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.468019" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.468091" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:19.362835" elapsed="0.105368"/>
</kw>
<msg time="2026-04-07T17:17:19.468300" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:19.468345" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.358371" elapsed="0.110015"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.468755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.468503" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.468484" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:19.358225" elapsed="0.110633"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:19.126459" elapsed="0.342440"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:19.124040" elapsed="0.344923"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:19.119456" elapsed="0.349600"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:19.119033" elapsed="0.350075"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:19.116374" elapsed="0.352794"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:17:19.477619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.477358" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.477339" elapsed="0.000361"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.478004" 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-07T17:17:19.478108" 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-07T17:17:19.477842" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.478657" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2" on remote system "10.30.171.56" 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-07T17:17:19.478279" elapsed="0.000422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.479262" level="INFO">${conn_id} = 166</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-07T17:17:19.478851" elapsed="0.000437"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.480199" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:19.480274" 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-07T17:17:19.479884" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.480449" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.481611" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:19.806437" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:19 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:19.481298" elapsed="0.325274"/>
</kw>
<msg time="2026-04-07T17:17:19.806651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.480928" elapsed="0.325798"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:19.479497" elapsed="0.327338"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:19.807362" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-04-07T17:17:19.890191" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:19.890444" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:19.890541" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': coul...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:19.807103" elapsed="0.083492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.891121" elapsed="0.000815"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.893086" level="INFO">ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': could not open network device vport2 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.892412" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.893668" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:19.893358" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.893309" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:19.894274" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.894026" elapsed="0.000380"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.893906" elapsed="0.000553"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.894533" elapsed="0.000030"/>
</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-07T17:17:19.899564" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.900321" elapsed="0.000232"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:19.900764" elapsed="0.000137"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.895254" elapsed="0.005748"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:19.476577" elapsed="0.424559"/>
</kw>
<msg time="2026-04-07T17:17:19.901214" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.476022" elapsed="0.425262"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:19.475513" elapsed="0.425885"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.902194" level="INFO">${dictionary_operational} = {'vport1': '2', 'vport2': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vport1=2</arg>
<arg>vport2=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.901677" elapsed="0.000556"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.902943" level="INFO">${dictionary_config} = {'vport1': '0', 'vport2': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vport1=0</arg>
<arg>vport2=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.902494" elapsed="0.000511"/>
</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-07T17:17:19.913572" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:19.913194" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.914100" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:19.913779" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:19.914170" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:19.914324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:19.912812" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.919635" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.919340" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:19.919706" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:19.919850" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.919000" elapsed="0.000874"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.928068" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.927800" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.928507" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.928265" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:19.937393" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:19.937529" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:19.937636" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:19.930644" elapsed="0.007018"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.928729" elapsed="0.008975"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.937908" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.937731" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.928710" elapsed="0.009307"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.942568" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.939064" elapsed="0.003576"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.938798" elapsed="0.003898"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.938780" elapsed="0.003954"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.946354" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.943169" elapsed="0.003252"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.942816" elapsed="0.003656"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.942791" elapsed="0.003717"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.947270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:19.946739" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.947597" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.947366" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.948149" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.947834" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.947678" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.947348" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.948742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:19.948382" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.949086" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.948837" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.949610" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.949320" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.949167" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.948818" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:19.949835" elapsed="0.000373"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:19.950676" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:19.950366" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:19.950850" elapsed="0.002139"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:19.938373" elapsed="0.014684"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:19.953233" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:17:19.953127" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.953109" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.953459" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:19.953569" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:17:19.955733" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:19.920220" elapsed="0.035540"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:19.955811" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:19.955993" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:19.918506" elapsed="0.037520"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.957208" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:19.956813" elapsed="0.000461"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:19.956666" elapsed="0.000649"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.957899" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:19.957542" elapsed="0.000418"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:19.957397" elapsed="0.000629"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:19.956534" elapsed="0.001521"/>
</for>
<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="PASS" start="2026-04-07T17:17:19.956271" elapsed="0.001838"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:19.914552" elapsed="0.043591"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.963508" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.963208" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:19.963581" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:19.963728" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:19.962851" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.969842" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.969599" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.970313" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.970048" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:19.985827" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:19.986002" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:19.986140" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:19.972314" elapsed="0.013901"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.970423" elapsed="0.015858"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.986537" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.986319" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.970405" elapsed="0.016257"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.993762" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.988756" elapsed="0.005107"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.988280" elapsed="0.005658"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.988240" elapsed="0.005786"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.996970" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:19.994678" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.994152" elapsed="0.002911"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.994116" elapsed="0.002971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.997607" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:19.997240" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.997930" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.997703" elapsed="0.000342"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.998543" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.998228" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.998070" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.997684" elapsed="0.000941"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:19.999154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:19.998778" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:19.999476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:19.999250" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.000023" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:19.999711" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:19.999557" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:19.999232" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.000254" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:20.001039" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.000752" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.001216" elapsed="0.002275"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:19.987305" elapsed="0.016249"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:20.003727" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.003623" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.003604" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.003952" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.004039" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:17:20.006156" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:19.964090" elapsed="0.042093"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:20.006234" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.006396" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:19.962367" elapsed="0.044055"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.007553" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.007190" elapsed="0.000426"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:20.007044" elapsed="0.000612"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.008267" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.007883" elapsed="0.000447"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:20.007736" elapsed="0.000632"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:20.006896" elapsed="0.001502"/>
</for>
<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="PASS" start="2026-04-07T17:17:20.006639" elapsed="0.001810"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:19.958229" elapsed="0.050253"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.013732" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.013436" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:20.013803" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.013947" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.013099" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.020171" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.019906" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.020605" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.020365" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:20.033903" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:20.034072" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:20.034208" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:20.022625" elapsed="0.011619"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.020715" elapsed="0.013588"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.034580" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.034338" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.020697" elapsed="0.014004"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.042253" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.036777" elapsed="0.005580"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.036305" elapsed="0.006130"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.036264" elapsed="0.006228"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.045320" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.043179" elapsed="0.002187"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.042683" elapsed="0.002717"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.042639" elapsed="0.002786"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.045995" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.045582" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.046325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.046096" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.046874" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.046575" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.046407" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.046077" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.047488" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.047131" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.047807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.047583" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.048348" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.048057" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.047887" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.047565" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.048573" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:20.049354" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.049086" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.049528" elapsed="0.002188"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:20.035339" elapsed="0.016438"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:20.051949" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.051845" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.051827" elapsed="0.000267"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.052239" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.052309" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:17:20.054432" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:20.014364" elapsed="0.040095"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:20.054510" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:20.054681" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:20.012601" elapsed="0.042105"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.055847" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.055480" elapsed="0.000430"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:20.055332" elapsed="0.000618"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.056554" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.056197" elapsed="0.000418"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:20.056049" elapsed="0.000605"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:20.055203" elapsed="0.001480"/>
</for>
<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="PASS" start="2026-04-07T17:17:20.054925" elapsed="0.001809"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:20.008567" elapsed="0.048201"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:19.914407" elapsed="0.142388"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:19.912250" elapsed="0.144594"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:17:19.903270" elapsed="0.153625"/>
</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-07T17:17:20.066450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:20.066074" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.066958" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:20.066630" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:20.067044" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:20.067197" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:20.065688" elapsed="0.001534"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.072621" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.072324" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:20.072693" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:20.072841" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.071964" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.079001" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.078726" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.079439" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.079199" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:20.088476" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:20.089569" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:20.089723" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:20.081463" elapsed="0.008286"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.079550" elapsed="0.010241"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.089965" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.089817" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.079531" elapsed="0.010535"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.093959" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.091097" elapsed="0.002980"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.090854" elapsed="0.003270"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.090806" elapsed="0.003353"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.097545" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.094582" elapsed="0.003026"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.094275" elapsed="0.003380"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.094249" elapsed="0.003441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.098451" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.097906" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.098940" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.098585" elapsed="0.000456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.099707" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.099295" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.099076" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.098560" elapsed="0.001263"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.100443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.100063" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.100764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.100538" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.101305" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.101014" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.100845" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.100520" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.101530" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:20.102319" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.102049" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.102492" elapsed="0.002253"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:20.090408" elapsed="0.014398"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:20.104994" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.104875" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.104857" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.105222" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.105291" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:17:20.107538" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:20.073201" elapsed="0.034365"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:20.107617" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:20.107766" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:20.071485" elapsed="0.036307"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.108942" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.108571" elapsed="0.000471"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:20.108426" elapsed="0.000656"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.109678" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.109318" elapsed="0.000436"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:20.109171" elapsed="0.000621"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:20.108298" elapsed="0.001523"/>
</for>
<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="PASS" start="2026-04-07T17:17:20.108034" elapsed="0.001838"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:20.067401" elapsed="0.042541"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.115160" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.114813" elapsed="0.000373"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:20.115239" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.115383" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.114476" elapsed="0.000931"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.121499" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.121253" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.121932" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.121691" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:20.138754" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:20.139926" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:20.140216" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:20.123962" elapsed="0.016311"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.122064" elapsed="0.018302"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.140749" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.140422" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.122046" elapsed="0.018889"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.148517" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.143207" elapsed="0.005410"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.142684" elapsed="0.005969"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.142645" elapsed="0.006033"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.151073" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.148953" elapsed="0.002165"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.148734" elapsed="0.002418"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.148716" elapsed="0.002461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.151715" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.151347" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.152057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.151811" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.152592" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.152295" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.152141" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.151793" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.153205" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.152828" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.153525" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.153300" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.154072" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.153758" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.153605" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.153282" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.154298" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:20.155084" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.154796" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.155283" elapsed="0.002126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:20.141719" elapsed="0.015752"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:20.157644" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.157540" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.157521" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.157868" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.157938" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:17:20.160206" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:20.115729" elapsed="0.044505"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:20.160285" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.160432" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:20.113997" elapsed="0.046461"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.161606" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.161238" elapsed="0.000447"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:20.161090" elapsed="0.000634"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.162330" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.161950" elapsed="0.000456"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:20.161804" elapsed="0.000677"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:20.160937" elapsed="0.001576"/>
</for>
<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="PASS" start="2026-04-07T17:17:20.160678" elapsed="0.001888"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:20.110049" elapsed="0.052551"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.167807" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.167510" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:20.167879" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:20.168044" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.167154" elapsed="0.000915"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.174358" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.174111" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.174789" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.174550" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:20.189446" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:20.189741" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3218'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:20.189900" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:20.176826" elapsed="0.013109"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.174898" elapsed="0.015125"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.190276" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.190061" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.174879" elapsed="0.015515"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.197057" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"409e8ee5-5710-49a4-984f-214e3063d25c","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"70c0b9dd-b211-4af8-92d9-771eac1b68d4","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"983a3c2a-c277-4953-9e21-74405608154b","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"e6:8e:9e:40:a4:49","ovsdb:ofport":65534,"ovsdb:ifindex":6},{"tp-id":"vport2","ovsdb:port-uuid":"7fca0bb2-30a9-4921-9085-dce43f86f2f3","ovsdb:interface-uuid":"8f82fca0-05da-4bde-ac4a-0b2b54cd1fa2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"3d143fad-e691-4fc4-b7b0-9113b55bbe16","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"f786064e-37e1-473c-a1d2-41c936d43a68","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"5f14ade8-4d02-4159-8c07-c5f59de378fa","ovsdb:interface-uuid":"88b462ec-f890-4186-9b11-4d01a50eb342","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:e6:8e:9e:40:a4:49"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.191831" elapsed="0.005502"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.191521" elapsed="0.005892"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.191493" elapsed="0.005977"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.201398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.198121" elapsed="0.003321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.197594" elapsed="0.003882"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.197556" elapsed="0.003944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.202042" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.201654" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.202370" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.202142" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.202903" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.202605" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.202453" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.202123" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.203531" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.203158" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.203855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.203628" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.204401" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:20.204107" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:20.203936" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.203610" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.204627" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:20.205417" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:20.205149" elapsed="0.000293"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.205589" elapsed="0.002128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:20.190868" elapsed="0.016911"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:20.207952" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.207847" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.207829" elapsed="0.000235"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.208207" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.208277" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:20.210502" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:20.168391" elapsed="0.042139"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:20.210580" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.210728" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:20.166656" elapsed="0.044098"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.211919" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.211533" elapsed="0.000482"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:17:20.211387" elapsed="0.000668"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.212642" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:20.212283" elapsed="0.000436"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:17:20.212136" elapsed="0.000658"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:20.211258" elapsed="0.001568"/>
</for>
<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="PASS" start="2026-04-07T17:17:20.210993" elapsed="0.001886"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:20.162687" elapsed="0.050226"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:20.067271" elapsed="0.145669"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:17:20.065133" elapsed="0.147874"/>
</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_operational}</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-07T17:17:20.057099" elapsed="0.155962"/>
</kw>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:17:19.473434" elapsed="0.739691"/>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:17:19.115755" elapsed="1.097491"/>
</test>
<test id="s1-s1-s1-t34" name="Delete the Bridge Manually and Verify After Recover" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:20.216465" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:20.216206" 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-07T17:17:20.217709" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.217600" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.217582" 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-07T17:17:20.222299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.222194" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.222177" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.223361" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:20.222962" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.223869" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:20.223542" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:20.223939" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:20.224112" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:20.222582" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.229203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.229093" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.229074" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.230503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.230394" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.230376" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:20.231086" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.230708" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.231517" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:20.231266" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.265934" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:20.232123" elapsed="0.034054"/>
</kw>
<msg time="2026-04-07T17:17:20.266356" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:20.266401" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.231723" elapsed="0.034713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.332727" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:20.267006" elapsed="0.065949"/>
</kw>
<msg time="2026-04-07T17:17:20.333173" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:20.333218" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.266601" elapsed="0.066652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.333550" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.333330" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.333310" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.334180" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.333787" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.334541" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.334330" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.334312" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:20.334672" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.336992" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:17:20.338470" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:20.339895" elapsed="0.000449"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.335512" elapsed="0.004913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:20.334929" elapsed="0.005619"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:20.230082" elapsed="0.110567"/>
</kw>
<msg time="2026-04-07T17:17:20.340740" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.340783" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.229425" elapsed="0.111393"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:20.341019" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.340895" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.340876" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.341494" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.341821" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.341892" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:20.228729" elapsed="0.113299"/>
</kw>
<msg time="2026-04-07T17:17:20.342122" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.342164" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.224485" elapsed="0.117713"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.342514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.342272" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.342255" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:20.224351" elapsed="0.118263"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.347859" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.347746" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.347727" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.349182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.349064" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.349046" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:20.349734" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.349386" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.350258" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:20.349913" elapsed="0.000371"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.384872" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:20.350819" elapsed="0.034237"/>
</kw>
<msg time="2026-04-07T17:17:20.385244" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:20.385290" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.350441" elapsed="0.034883"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.466192" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:20.385870" elapsed="0.080562"/>
</kw>
<msg time="2026-04-07T17:17:20.466634" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:20.466682" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.385489" elapsed="0.081228"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.467094" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.466813" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.466784" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.467748" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.467341" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.468166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.467898" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.467880" elapsed="0.000386"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:20.468299" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.470896" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:17:20.472363" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:20.473795" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.469431" elapsed="0.004782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:20.468571" elapsed="0.005756"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:20.348743" elapsed="0.125685"/>
</kw>
<msg time="2026-04-07T17:17:20.474520" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.474563" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.348125" elapsed="0.126474"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:20.474784" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.474676" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.474657" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.475316" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.475643" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.475714" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:20.347399" elapsed="0.128422"/>
</kw>
<msg time="2026-04-07T17:17:20.475911" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.475954" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.342867" elapsed="0.133138"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.476336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.476085" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.476065" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:20.342732" elapsed="0.133704"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.481590" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.481477" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.481458" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.482841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:20.482730" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.482712" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:20.483416" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:20.483060" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.483838" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:20.483595" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.513996" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:20.484418" elapsed="0.029755"/>
</kw>
<msg time="2026-04-07T17:17:20.514340" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:20.514386" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.484034" elapsed="0.030387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.584523" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:20.514989" elapsed="0.069813"/>
</kw>
<msg time="2026-04-07T17:17:20.585071" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:20.585138" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.514588" elapsed="0.070603"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.585638" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.585302" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.585274" elapsed="0.000513"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.586535" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:20.586010" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.587084" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.586748" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.586723" elapsed="0.000585"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:20.587355" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.590551" elapsed="0.000725"/>
</kw>
<kw name="Open 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-07T17:17:20.592540" elapsed="0.000709"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:20.594451" elapsed="0.000470"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:20.588518" elapsed="0.006491"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:20.587704" elapsed="0.007420"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:20.482426" elapsed="0.112798"/>
</kw>
<msg time="2026-04-07T17:17:20.595312" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.595355" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.481801" elapsed="0.113591"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:20.595575" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:20.595469" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.595450" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.596048" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.596373" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:20.596444" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:20.481120" elapsed="0.115430"/>
</kw>
<msg time="2026-04-07T17:17:20.596641" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:20.596684" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.476692" elapsed="0.120028"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:20.597052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.596794" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.596777" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:20.476558" elapsed="0.120593"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:20.224187" elapsed="0.372995"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:20.221825" elapsed="0.375412"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:20.217318" elapsed="0.379973"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:20.216872" elapsed="0.380466"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:20.214043" elapsed="0.383349"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:17:20.605737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:20.605454" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:20.605436" elapsed="0.000382"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.606132" 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-07T17:17:20.606233" 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-07T17:17:20.605962" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.606822" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:17:20.606443" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.607406" level="INFO">${conn_id} = 171</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-07T17:17:20.607036" elapsed="0.000395"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:20.608355" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:20.608431" 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-07T17:17:20.608067" elapsed="0.000387"/>
</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-07T17:17:20.608608" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.609798" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:20.989518" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:19 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:20.609457" elapsed="0.380239"/>
</kw>
<msg time="2026-04-07T17:17:20.989793" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.609107" elapsed="0.380799"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:20.607650" elapsed="0.382436"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:20.990646" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:17:21.094501" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:21.094750" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:21.094844" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:20.990364" elapsed="0.104530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:21.095347" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.096903" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.096237" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.097523" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.097207" elapsed="0.000432"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.097154" elapsed="0.000536"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:21.098079" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.097807" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.097774" elapsed="0.000509"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.098366" elapsed="0.000029"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.104299" elapsed="0.000803"/>
</kw>
<kw name="Open 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-07T17:17:21.105272" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:21.105576" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.099073" elapsed="0.006649"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:20.604863" elapsed="0.500948"/>
</kw>
<msg time="2026-04-07T17:17:21.105864" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:20.604311" elapsed="0.501601"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:20.603786" elapsed="0.502284"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.106567" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.106248" elapsed="0.000345"/>
</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-07T17:17:21.112948" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:21.112551" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.113459" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:21.113153" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:21.113529" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.113681" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:21.112147" elapsed="0.001559"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.119024" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.118709" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:21.119096" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.119241" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.118367" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.125742" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.125493" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.126226" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.125935" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:21.135481" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:21.135682" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:21.135807" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:21.128250" elapsed="0.007584"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.126347" elapsed="0.009530"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.136078" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.135903" elapsed="0.000241"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.126328" elapsed="0.009839"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.140564" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.137274" elapsed="0.003435"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.137006" elapsed="0.003753"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.136968" elapsed="0.003827"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.144237" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.141203" elapsed="0.003099"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.140873" elapsed="0.003478"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.140849" elapsed="0.003537"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.145300" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.144609" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.145635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.145402" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.146199" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.145878" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.145719" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.145383" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.146804" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.146439" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.147150" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.146902" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.147692" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.147387" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.147233" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.146884" elapsed="0.000910"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.147943" elapsed="0.000367"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:21.148783" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.148471" elapsed="0.000338"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.148958" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:21.136529" elapsed="0.014629"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:21.151336" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.151231" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.151212" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.151563" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.151631" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:21.153824" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:21.119595" elapsed="0.034257"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:21.153901" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:21.154066" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:21.117870" elapsed="0.036223"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.155250" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:21.154857" elapsed="0.000464"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:21.154709" elapsed="0.000650"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:21.154579" elapsed="0.000812"/>
</for>
<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="PASS" start="2026-04-07T17:17:21.154318" elapsed="0.001125"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:21.113919" elapsed="0.041593"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.160898" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.160569" elapsed="0.000356"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:21.160985" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:21.161136" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.160231" elapsed="0.000933"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.167339" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.167085" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.167773" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.167532" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:21.183786" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:21.184171" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:21.184400" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:21.169797" elapsed="0.014660"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.167882" elapsed="0.016670"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.184962" elapsed="0.000075"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.184609" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.167864" elapsed="0.017317"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.192553" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.187432" elapsed="0.005247"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.186906" elapsed="0.005849"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.186866" elapsed="0.005944"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.196079" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.193497" elapsed="0.002627"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.193008" elapsed="0.003149"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.192894" elapsed="0.003287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.196699" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.196333" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.197051" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.196794" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.197627" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.197325" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.197167" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.196776" elapsed="0.000934"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.198255" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.197861" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.198577" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.198351" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.199119" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.198809" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.198657" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.198332" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.199346" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:21.200144" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.199854" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.200319" elapsed="0.002274"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:21.185944" elapsed="0.016712"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:21.202828" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.202724" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.202706" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.203069" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.203140" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:21.205350" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:21.161481" elapsed="0.043897"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:21.205428" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.205575" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:21.159729" elapsed="0.045872"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.206751" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:21.206372" elapsed="0.000447"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:21.206227" elapsed="0.000632"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:21.206097" elapsed="0.000790"/>
</for>
<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="PASS" start="2026-04-07T17:17:21.205818" elapsed="0.001120"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:21.155602" elapsed="0.051387"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.212192" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.211869" elapsed="0.000349"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:21.212263" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.212409" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.211527" elapsed="0.000907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.218661" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.218412" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.219161" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.218895" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:21.232546" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:21.232697" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1487'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:17:21.232800" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:21.221185" elapsed="0.011641"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.219273" elapsed="0.013595"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.233065" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.232894" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.219254" elapsed="0.013942"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.238033" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":54108,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":"3eb07ef3-5df0-4195-8cad-5c56eb67b298"},{"external-id-key":"hostname","external-id-value":"ubuntu-22-04-mininet-ovs-217-44de9062-40d9-457e-9c72-27a350434d"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.234616" elapsed="0.003497"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.234318" elapsed="0.003843"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.234293" elapsed="0.003903"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.241582" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.238579" elapsed="0.003066"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.238273" elapsed="0.003420"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.238250" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.242472" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.241946" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.242799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.242569" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.243354" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.243052" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.242881" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.242550" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.243953" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.243590" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.244326" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.244066" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.244860" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.244565" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:21.244409" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.244048" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.245104" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:21.245896" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:21.245625" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.246088" elapsed="0.002150"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:21.233710" elapsed="0.014590"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:21.248476" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.248369" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.248350" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.248703" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.248787" elapsed="0.000019"/>
</return>
<msg time="2026-04-07T17:17:21.251022" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:21.212749" elapsed="0.038303"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:21.251102" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:21.251250" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/9a5df812-eb49-4477-a37e-2d464c02791d","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:17:21.211043" elapsed="0.040233"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.252429" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:21.252048" elapsed="0.000449"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:17:21.251882" elapsed="0.000654"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:21.251753" elapsed="0.000813"/>
</for>
<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="PASS" start="2026-04-07T17:17:21.251494" elapsed="0.001124"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:21.207078" elapsed="0.045572"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:21.113766" elapsed="0.138912"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:17:21.111465" elapsed="0.141261"/>
</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-07T17:17:21.106777" elapsed="0.146000"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:17:20.601552" elapsed="0.651287"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:17:20.213449" elapsed="1.039509"/>
</test>
<test id="s1-s1-s1-t35" name="Verify Modified Port After Recover" line="170">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:21.256158" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:21.255876" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.257456" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.257346" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.257327" 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-07T17:17:21.262259" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.262152" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.262134" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.263350" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:21.262956" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.263840" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:21.263530" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:21.263910" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.264083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:21.262587" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.269133" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.269025" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.269006" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.270417" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.270312" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.270295" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:21.270993" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.270621" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.271429" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:21.271175" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.302200" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:21.272001" elapsed="0.030375"/>
</kw>
<msg time="2026-04-07T17:17:21.302559" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:21.302606" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.271607" elapsed="0.031035"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.356656" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:21.303297" elapsed="0.053550"/>
</kw>
<msg time="2026-04-07T17:17:21.357033" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:21.357079" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.302820" elapsed="0.054295"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.357422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.357196" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.357174" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.358063" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.357660" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.358421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.358213" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.358195" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:21.358553" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.360886" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:17:21.362428" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:21.363846" elapsed="0.000493"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.359422" elapsed="0.004989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:21.358821" elapsed="0.005705"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:21.270007" elapsed="0.094620"/>
</kw>
<msg time="2026-04-07T17:17:21.364718" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.364761" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.269357" elapsed="0.095441"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:21.364997" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.364874" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.364855" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.365474" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.365821" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.365893" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:21.268678" elapsed="0.097349"/>
</kw>
<msg time="2026-04-07T17:17:21.366119" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.366167" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.264458" elapsed="0.101746"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.366520" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.366277" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.366260" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:21.264322" elapsed="0.102296"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.371907" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.371799" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.371780" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.373185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.373079" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.373061" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:21.373745" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.373390" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.374229" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:21.373939" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.405471" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:21.374784" elapsed="0.030845"/>
</kw>
<msg time="2026-04-07T17:17:21.405795" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:21.405840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.374408" elapsed="0.031468"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.458331" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:21.406450" elapsed="0.052065"/>
</kw>
<msg time="2026-04-07T17:17:21.458732" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:21.458778" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.406065" elapsed="0.052750"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.459130" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.458891" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.458871" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.459731" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.459365" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.460106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.459879" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.459860" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:21.460239" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.462530" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:17:21.463961" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:21.465366" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.461076" elapsed="0.004676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:21.460491" elapsed="0.005375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:21.372764" elapsed="0.093200"/>
</kw>
<msg time="2026-04-07T17:17:21.466076" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.466118" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.372139" elapsed="0.094015"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:21.466362" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.466229" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.466211" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.466819" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.467331" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.467404" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:21.371461" elapsed="0.096051"/>
</kw>
<msg time="2026-04-07T17:17:21.467603" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.467645" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.366874" elapsed="0.100807"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.468026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.467754" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.467737" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:21.366740" elapsed="0.101386"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.473321" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.473209" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.472969" elapsed="0.000420"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.474643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.474537" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.474519" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:21.475224" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.474848" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.475644" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:21.475401" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.505717" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:21.476222" elapsed="0.029654"/>
</kw>
<msg time="2026-04-07T17:17:21.506058" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:21.506103" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.475821" elapsed="0.030322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:21.556611" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:21.506763" elapsed="0.050033"/>
</kw>
<msg time="2026-04-07T17:17:21.556961" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:21.557030" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.506313" elapsed="0.050754"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.557357" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.557143" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.557123" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.557958" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.557594" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.558346" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.558136" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.558118" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:21.558477" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:21.560766" elapsed="0.000615"/>
</kw>
<kw name="Open 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-07T17:17:21.562320" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:21.563726" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.559325" elapsed="0.004805"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:21.558742" elapsed="0.005507"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:21.474211" elapsed="0.090136"/>
</kw>
<msg time="2026-04-07T17:17:21.564436" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.564480" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.473533" elapsed="0.090983"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:21.564697" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:21.564591" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.564572" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.565171" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.565534" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.565605" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:21.472649" elapsed="0.093062"/>
</kw>
<msg time="2026-04-07T17:17:21.565801" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:21.565843" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.468377" elapsed="0.097502"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.566224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.565952" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:21.565936" elapsed="0.000364"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:21.468244" elapsed="0.098078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:21.264158" elapsed="0.302192"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:21.261776" elapsed="0.304630"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:21.257030" elapsed="0.309435"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:21.256589" elapsed="0.309922"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:21.253742" elapsed="0.312822"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.573188" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:21.572820" 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-07T17:17:21.582847" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:21.582455" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.583347" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:21.583045" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:21.583416" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:21.583567" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:21.582092" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.588840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:21.588546" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:21.588911" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:21.589193" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:21.588210" elapsed="0.001011"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.595316" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.595069" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:21.595744" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:21.595506" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:21.606598" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:21.606774" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:21.607006" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:21.597834" elapsed="0.009729">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:21.595852" elapsed="0.011828">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.607937" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:21.607726" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:21.595834" elapsed="0.012250">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.608587" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.608768" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:21.608718" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:21.608695" elapsed="0.000159"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:21.609065" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.609164" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:21.589546" elapsed="0.019769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:21.609399" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:17:21.587716" elapsed="0.021812">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:21.609841" elapsed="0.000033"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:21.583776" elapsed="0.026171">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:21.583642" elapsed="0.026408">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:21.581433" elapsed="0.028742">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:22.626221" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:22.625732" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:22.626731" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:22.626422" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:22.626804" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:22.626994" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:22.625350" elapsed="0.001671"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:22.632283" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:22.631984" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:22.632438" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:22.632588" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:22.631607" elapsed="0.001006"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:22.638888" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:22.638634" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:22.639341" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:22.639098" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:22.648871" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:22.649084" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:22.649225" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:22.641363" elapsed="0.008370">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:22.639456" elapsed="0.010392">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:22.650127" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:22.649894" elapsed="0.000325"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:22.639435" elapsed="0.010817">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:22.650752" elapsed="0.000034"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:22.650934" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:22.650883" elapsed="0.000131"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:22.650860" elapsed="0.000186"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:22.651238" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:22.651333" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:22.632952" elapsed="0.018525">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:22.651604" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-04-07T17:17:22.631131" elapsed="0.020608">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:22.652088" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:22.627228" elapsed="0.024968">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:22.627081" elapsed="0.025196">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:22.624554" elapsed="0.027894">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:23.667006" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:23.666362" elapsed="0.000679"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:23.667523" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:23.667209" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:23.667597" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:23.667768" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:23.665953" elapsed="0.001841"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:23.673128" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:23.672812" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:23.673201" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:23.673347" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:23.672463" elapsed="0.000909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:23.679810" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:23.679555" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:23.680285" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:23.680039" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:23.690353" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:23.690492" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:23.690594" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:23.682287" elapsed="0.008708">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:23.680401" elapsed="0.010678">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:23.691309" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:23.691112" elapsed="0.000289"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:23.680381" elapsed="0.011053">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:23.691941" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:23.692181" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:23.692128" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:23.692102" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:23.692530" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:23.692630" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:23.673705" elapsed="0.019070">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:23.692861" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:17:23.671941" elapsed="0.021072">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:23.693339" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:23.668028" elapsed="0.025420">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:23.667850" elapsed="0.025695">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:23.665161" elapsed="0.028520">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:24.707714" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:24.707121" elapsed="0.000631"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:24.708296" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:24.707952" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:24.708375" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:17:24.708566" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:24.706695" elapsed="0.001900"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:24.717987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:24.717358" elapsed="0.000688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:24.718145" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:17:24.718408" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:24.716724" elapsed="0.001719"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:24.728783" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:24.728514" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:24.729244" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:24.728996" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:24.740112" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:24.740273" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:24.740492" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:24.731299" elapsed="0.009991">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:24.729372" elapsed="0.012105">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:24.741897" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:24.741554" elapsed="0.000519"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:24.729348" elapsed="0.012780">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:24.742930" elapsed="0.000084"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:24.743256" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:24.743175" elapsed="0.000174"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:24.743136" elapsed="0.000260"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:24.743702" elapsed="0.000046"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:24.743852" elapsed="0.000036"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:24.718952" elapsed="0.025203">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:24.744297" elapsed="0.000033"/>
</return>
<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="FAIL" start="2026-04-07T17:17:24.714903" elapsed="0.029598">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:24.745056" elapsed="0.000055"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:24.708809" elapsed="0.036421">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:24.708659" elapsed="0.036706">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:24.705777" elapsed="0.039794">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:25.760875" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:25.760431" elapsed="0.000473"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:25.761390" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:25.761081" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:25.761464" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:25.761625" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:25.760045" elapsed="0.001604"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:25.766913" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:25.766611" elapsed="0.000329"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:25.767052" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:25.767203" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:25.766274" elapsed="0.000955"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:25.834112" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:25.833584" elapsed="0.000605"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:25.834615" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:25.834369" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:25.844965" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:25.845139" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:25.845283" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:25.836723" elapsed="0.008987">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:25.834762" elapsed="0.011069">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:25.846127" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:25.845885" elapsed="0.000336"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:25.834725" elapsed="0.011529">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:25.846837" elapsed="0.000041"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:25.847062" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:25.847003" elapsed="0.000123"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:25.846958" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:25.847353" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:25.847447" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:25.767590" elapsed="0.080031">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:25.847709" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:17:25.765777" elapsed="0.082062">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:25.848199" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:25.761859" elapsed="0.086450">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:25.761711" elapsed="0.086685">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:25.759022" elapsed="0.089584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:26.864096" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:26.863611" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.864604" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:26.864289" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:26.864678" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:17:26.864845" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:26.863225" elapsed="0.001645"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.870366" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:26.870064" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:26.870439" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:26.870615" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:26.869708" elapsed="0.000932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.876764" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:26.876513" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.877223" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:26.876963" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:26.887219" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:26.887493" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:26.887710" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:26.879263" elapsed="0.009261">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:26.877339" elapsed="0.011365">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:26.889146" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:26.888778" elapsed="0.000516"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:26.877318" elapsed="0.012027">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:26.890167" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.890458" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:26.890380" elapsed="0.000186"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:26.890343" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:26.891044" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.891201" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:26.870991" elapsed="0.020441">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.891565" elapsed="0.000032"/>
</return>
<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="FAIL" start="2026-04-07T17:17:26.869226" elapsed="0.022541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:26.892303" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:26.865093" elapsed="0.027382">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:26.864929" elapsed="0.027670">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:26.862181" elapsed="0.030617">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:17:26.893036" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:17:21.573400" elapsed="5.319841">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:21.570608" elapsed="5.322877">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:21.253206" elapsed="5.640597">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s1-t36" name="Delete Port In New Owner After Recover" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:26.897872" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:26.897601" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.899148" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:26.899038" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.899019" 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-07T17:17:26.903756" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:26.903650" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.903633" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.904802" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:26.904424" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.905301" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:26.904999" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:26.905371" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:26.905563" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:26.904056" elapsed="0.001532"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.910649" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:26.910519" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.910501" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:26.911940" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:26.911832" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.911815" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:26.912531" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:26.912172" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:26.912962" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:26.912713" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:26.944179" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:26.913553" elapsed="0.030787"/>
</kw>
<msg time="2026-04-07T17:17:26.944540" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:26.944587" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:26.913174" elapsed="0.031448"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:26.996463" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:26.945209" elapsed="0.051439"/>
</kw>
<msg time="2026-04-07T17:17:26.996817" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:26.996862" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:26.944791" elapsed="0.052106"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:26.997231" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:26.997003" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.996958" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:26.997843" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:26.997472" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:26.998220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:26.998008" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:26.997988" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:26.998351" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.000710" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:17:27.002179" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.003594" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:26.999260" elapsed="0.004744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:26.998627" elapsed="0.005495"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:26.911534" elapsed="0.092688"/>
</kw>
<msg time="2026-04-07T17:17:27.004357" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.004401" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:26.910863" elapsed="0.093573"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.004620" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.004513" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.004494" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.005113" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.005443" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.005514" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:26.910188" elapsed="0.095431"/>
</kw>
<msg time="2026-04-07T17:17:27.005711" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.005754" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:26.905939" elapsed="0.099849"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.006139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.005862" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.005845" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:26.905804" elapsed="0.100436"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.011457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.011349" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.011323" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.012697" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.012589" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.012571" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.013278" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.012905" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.013702" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.013459" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.045374" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.014359" elapsed="0.031193"/>
</kw>
<msg time="2026-04-07T17:17:27.045724" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.045769" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.013882" elapsed="0.031921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.103944" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.046389" elapsed="0.057756"/>
</kw>
<msg time="2026-04-07T17:17:27.104309" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.104354" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.045993" elapsed="0.058395"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.104689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.104470" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.104447" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.105534" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.104990" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.105896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.105683" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.105664" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.106047" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.108372" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.109785" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.111191" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.106890" elapsed="0.004692"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.106315" elapsed="0.005380"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.012292" elapsed="0.099503"/>
</kw>
<msg time="2026-04-07T17:17:27.111886" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.111933" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.011668" elapsed="0.100314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.112170" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.112063" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.112044" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.112633" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.112954" elapsed="0.000060"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.113062" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.011003" elapsed="0.102167"/>
</kw>
<msg time="2026-04-07T17:17:27.113261" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.113304" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.006496" elapsed="0.106843"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.113654" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.113413" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.113396" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:27.006361" elapsed="0.107392"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.118820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.118710" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.118692" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.120214" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.120107" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.120089" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.120770" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.120419" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.121336" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.120957" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.151514" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.121940" elapsed="0.029736"/>
</kw>
<msg time="2026-04-07T17:17:27.151848" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.151894" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.121557" elapsed="0.030372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.212040" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.152511" elapsed="0.059725"/>
</kw>
<msg time="2026-04-07T17:17:27.212416" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.212463" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.152121" elapsed="0.060378"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.212813" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.212584" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.212562" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.213467" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.213084" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.213830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.213615" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.213597" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.213964" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.216486" elapsed="0.000556"/>
</kw>
<kw name="Open 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-07T17:17:27.217946" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.219335" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.214822" elapsed="0.004979"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.214241" elapsed="0.005677"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.119791" elapsed="0.100246"/>
</kw>
<msg time="2026-04-07T17:17:27.220130" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.220174" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.119158" elapsed="0.101052"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.220399" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.220290" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.220270" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.220870" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.221217" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.221289" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.118375" elapsed="0.103023"/>
</kw>
<msg time="2026-04-07T17:17:27.221530" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.221576" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.114030" elapsed="0.107583"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.221935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.221689" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.221672" elapsed="0.000373"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:27.113872" elapsed="0.108197"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:26.905638" elapsed="0.316462"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:26.903295" elapsed="0.318863"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:26.898737" elapsed="0.323479"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:26.898304" elapsed="0.323958"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:26.895456" elapsed="0.326861"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:27.233821" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:27.230258" elapsed="0.003603">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:26.894638" elapsed="0.339387">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t37" name="Delete Bridge In New Owner And Verify After Recover" line="178">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:27.237340" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:27.237080" 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-07T17:17:27.238578" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.238468" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.238450" 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-07T17:17:27.243165" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.243059" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.243041" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.244263" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:27.243864" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.244749" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:27.244447" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:27.244819" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:27.244987" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:27.243452" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.250319" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.250209" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.250190" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.251693" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.251485" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.251467" elapsed="0.000296"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.252298" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.251905" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.252725" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.252480" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.282241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.253304" elapsed="0.029143"/>
</kw>
<msg time="2026-04-07T17:17:27.282617" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.282666" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.252906" elapsed="0.029796"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.347567" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.283309" elapsed="0.064453"/>
</kw>
<msg time="2026-04-07T17:17:27.347946" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.348014" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.282870" elapsed="0.065181"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.348353" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.348133" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.348111" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.348964" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.348593" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.349346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.349134" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.349116" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.349479" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.351764" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:17:27.353250" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.354633" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.350324" elapsed="0.004713"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.349734" elapsed="0.005418"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.251181" elapsed="0.104068"/>
</kw>
<msg time="2026-04-07T17:17:27.355342" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.355385" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.250537" elapsed="0.104883"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.355601" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.355497" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.355478" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.356088" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.356416" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.356488" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.249847" elapsed="0.106747"/>
</kw>
<msg time="2026-04-07T17:17:27.356685" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.356728" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.245374" elapsed="0.111390"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.357156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.356877" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.356859" elapsed="0.000374"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:27.245238" elapsed="0.112018"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.362895" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.362785" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.362765" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.364191" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.364085" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.364068" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.364751" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.364396" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.365210" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.364927" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.398853" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.365766" elapsed="0.033603"/>
</kw>
<msg time="2026-04-07T17:17:27.399826" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.400005" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.365390" elapsed="0.034703"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.464926" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.401337" elapsed="0.063825"/>
</kw>
<msg time="2026-04-07T17:17:27.465337" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.465385" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.400566" elapsed="0.064855"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.465787" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.465524" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.465494" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.466462" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.466066" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.466833" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.466620" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.466602" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.466988" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.469546" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:17:27.471061" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.472520" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.467992" elapsed="0.004934"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.467317" elapsed="0.005833"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.363761" elapsed="0.109495"/>
</kw>
<msg time="2026-04-07T17:17:27.473355" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.473400" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.363130" elapsed="0.110306"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.473632" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.473518" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.473497" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.474162" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.474511" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.474583" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.362395" elapsed="0.112299"/>
</kw>
<msg time="2026-04-07T17:17:27.474795" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.474846" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.357508" elapsed="0.117373"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.475330" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.474960" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.474942" elapsed="0.000467"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:27.357376" elapsed="0.118057"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.481023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.480896" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.480877" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.482287" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.482180" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.482162" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.482861" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.482495" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.483314" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.483063" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.516551" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.483870" elapsed="0.032945"/>
</kw>
<msg time="2026-04-07T17:17:27.517124" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.517184" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.483493" elapsed="0.033726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.586956" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.517860" elapsed="0.069368"/>
</kw>
<msg time="2026-04-07T17:17:27.587425" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.587473" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.517422" elapsed="0.070086"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.587926" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.587680" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.587649" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.588604" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.588207" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.588992" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.588761" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.588741" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.589131" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.591521" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:17:27.593017" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.594430" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.590035" elapsed="0.004798"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.589426" elapsed="0.005525"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.481851" elapsed="0.113218"/>
</kw>
<msg time="2026-04-07T17:17:27.595167" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.595212" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.481239" elapsed="0.114008"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.595434" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.595326" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.595307" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.595920" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.596279" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.596352" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.480541" elapsed="0.115934"/>
</kw>
<msg time="2026-04-07T17:17:27.596573" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.596618" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.475711" elapsed="0.120943"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.596992" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.596732" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.596715" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:27.475571" elapsed="0.121526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:27.245067" elapsed="0.352064"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:27.242680" elapsed="0.354511"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:27.238182" elapsed="0.359076"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.237750" elapsed="0.359557"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:27.234994" elapsed="0.362367"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:27.609076" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:27.605316" elapsed="0.003800">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:27.234381" elapsed="0.374886">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t38" name="Create Bridge In Old Owner and Verify After Recover" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:27.612541" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:27.612275" 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-07T17:17:27.613770" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.613660" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.613641" 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-07T17:17:27.618394" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.618287" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.618269" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.619441" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:27.619064" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.619922" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:27.619621" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:27.620010" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:27.620164" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:27.618678" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.625396" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.625289" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.625270" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.626633" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.626527" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.626510" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.627220" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.626836" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.627645" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.627400" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.659591" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.628217" elapsed="0.031545"/>
</kw>
<msg time="2026-04-07T17:17:27.659932" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.659998" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.627821" elapsed="0.032214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.726874" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.660740" elapsed="0.066348"/>
</kw>
<msg time="2026-04-07T17:17:27.727256" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.727301" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.660202" elapsed="0.067133"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.727651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.727424" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.727402" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.728345" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.727944" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.728706" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.728495" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.728478" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.728867" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.731171" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:17:27.732617" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.734041" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.729713" elapsed="0.004717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.729142" elapsed="0.005401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.626232" elapsed="0.108409"/>
</kw>
<msg time="2026-04-07T17:17:27.734731" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.734774" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.625609" elapsed="0.109199"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.735007" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.734884" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.734865" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.735472" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.735798" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.735867" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.624938" elapsed="0.111063"/>
</kw>
<msg time="2026-04-07T17:17:27.736097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.736140" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.620565" elapsed="0.115610"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.736493" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.736250" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.736233" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:27.620415" elapsed="0.116176"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.742081" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.741958" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.741937" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.743337" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.743232" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.743214" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.743896" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.743543" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.744375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.744126" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.789834" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.744959" elapsed="0.045368"/>
</kw>
<msg time="2026-04-07T17:17:27.790749" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.790854" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.744556" elapsed="0.046376"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.853399" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.792318" elapsed="0.061452"/>
</kw>
<msg time="2026-04-07T17:17:27.854046" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.854095" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.791358" elapsed="0.062774"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.854613" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.854261" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.854220" elapsed="0.000508"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.855393" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.854873" elapsed="0.000611"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.855768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.855552" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.855534" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.855905" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.858531" elapsed="0.000558"/>
</kw>
<kw name="Open 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-07T17:17:27.860071" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.861528" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.856929" elapsed="0.005006"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.856272" elapsed="0.005800"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.742907" elapsed="0.119267"/>
</kw>
<msg time="2026-04-07T17:17:27.862270" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.862316" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.742296" elapsed="0.120056"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.862538" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.862430" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.862411" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.863068" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.863410" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.863483" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.741618" elapsed="0.122041"/>
</kw>
<msg time="2026-04-07T17:17:27.863756" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.863800" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.736869" elapsed="0.126966"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.864180" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.863912" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.863895" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:27.736711" elapsed="0.127570"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.871803" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.871691" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.871672" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.873087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:27.872950" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.872933" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:27.873680" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.873318" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.874130" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:27.873860" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.916869" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:27.874686" elapsed="0.042355"/>
</kw>
<msg time="2026-04-07T17:17:27.917209" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:27.917266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.874310" elapsed="0.042992"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:27.982838" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:27.917855" elapsed="0.065199"/>
</kw>
<msg time="2026-04-07T17:17:27.983222" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:27.983267" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.917469" elapsed="0.065832"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.983593" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.983378" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.983358" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:27.984222" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:27.983829" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.984578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.984370" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.984352" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:27.984709" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:27.986997" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:27.988450" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:27.989820" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:27.985561" elapsed="0.004660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:27.984956" elapsed="0.005378"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:27.872652" elapsed="0.117781"/>
</kw>
<msg time="2026-04-07T17:17:27.990524" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.990567" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.872038" elapsed="0.118564"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:27.990785" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:27.990679" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.990661" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.991258" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.991582" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:27.991652" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:27.871340" elapsed="0.120417"/>
</kw>
<msg time="2026-04-07T17:17:27.991848" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:27.991892" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.864557" elapsed="0.127369"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:27.992276" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:27.992033" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:27.992015" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:27.864419" elapsed="0.127956"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:27.620244" elapsed="0.372161"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:27.617909" elapsed="0.374556"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:27.613373" elapsed="0.379148"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:27.612946" elapsed="0.379620"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:27.610292" elapsed="0.382327"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:28.004469" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.000730" elapsed="0.003777">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:27.609666" elapsed="0.395003">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t39" name="Create Port In Old Owner and Verify After Recover" line="186">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:28.007910" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:28.007654" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.009151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.009041" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.009023" 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-07T17:17:28.013748" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.013642" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.013624" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.014886" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:28.014505" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.015388" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:28.015085" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:28.015456" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:28.015609" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:28.014070" elapsed="0.001563"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.020814" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.020707" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.020688" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.022089" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.021961" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.021944" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.022641" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.022293" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.023076" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.022817" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.053774" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.023631" elapsed="0.030313"/>
</kw>
<msg time="2026-04-07T17:17:28.054185" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.054230" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.023255" elapsed="0.031010"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.135064" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.054808" elapsed="0.080514"/>
</kw>
<msg time="2026-04-07T17:17:28.135542" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.135590" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.054429" elapsed="0.081196"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.136074" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.135744" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.135705" elapsed="0.000481"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.136792" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.136331" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.137181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.136945" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.136926" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.137320" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.139822" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:17:28.141314" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.142836" elapsed="0.000351"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.138309" elapsed="0.004954"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.137635" elapsed="0.005745"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.021664" elapsed="0.121819"/>
</kw>
<msg time="2026-04-07T17:17:28.143579" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.143624" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.021042" elapsed="0.122620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.143848" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.143741" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.143723" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.144366" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.144707" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.144778" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.020371" elapsed="0.124516"/>
</kw>
<msg time="2026-04-07T17:17:28.145001" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.145046" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.016011" elapsed="0.129071"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.145406" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.145160" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.145142" elapsed="0.000341"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:28.015860" elapsed="0.129647"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.151241" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.151127" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.151107" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.152623" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.152509" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.152491" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.153264" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.152845" elapsed="0.000447"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.153726" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.153452" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.184326" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.154380" elapsed="0.030217"/>
</kw>
<msg time="2026-04-07T17:17:28.184870" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.184941" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.153952" elapsed="0.031061"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.254159" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.185953" elapsed="0.068428"/>
</kw>
<msg time="2026-04-07T17:17:28.254615" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.254664" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.185295" elapsed="0.069405"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.255060" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.254787" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.254763" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.255681" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.255304" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.256063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.255833" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.255815" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.256198" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.258602" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.260104" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.261498" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.257102" elapsed="0.004788"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.256493" elapsed="0.005527"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.152177" elapsed="0.109956"/>
</kw>
<msg time="2026-04-07T17:17:28.262229" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.262275" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.151468" elapsed="0.110843"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.262498" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.262391" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.262372" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.262991" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.263329" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.263400" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.150735" elapsed="0.112778"/>
</kw>
<msg time="2026-04-07T17:17:28.263610" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.263655" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.145784" elapsed="0.117909"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.264045" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.263770" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.263753" elapsed="0.000370"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:28.145646" elapsed="0.118501"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.269622" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.269514" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.269495" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.270924" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.270785" elapsed="0.000225"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.270767" elapsed="0.000270"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.271543" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.271183" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.271982" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.271724" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.304557" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.272545" elapsed="0.032183"/>
</kw>
<msg time="2026-04-07T17:17:28.304896" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.304943" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.272166" elapsed="0.032833"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.366364" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.305552" elapsed="0.061007"/>
</kw>
<msg time="2026-04-07T17:17:28.366725" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.366770" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.305167" elapsed="0.061638"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.367137" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.366882" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.366861" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.367739" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.367375" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.368119" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.367889" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.367871" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.368255" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.370521" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:17:28.371951" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.373363" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.369088" elapsed="0.004659"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.368507" elapsed="0.005352"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.270484" elapsed="0.103473"/>
</kw>
<msg time="2026-04-07T17:17:28.374066" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.374111" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.269837" elapsed="0.104314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.374332" elapsed="0.000052"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.374227" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.374208" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.374816" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.375205" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.375277" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.269158" elapsed="0.106224"/>
</kw>
<msg time="2026-04-07T17:17:28.375472" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.375515" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.264415" elapsed="0.111134"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.375864" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.375622" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.375605" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:28.264278" elapsed="0.111685"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:28.015690" elapsed="0.360335"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:28.013271" elapsed="0.362812"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:28.008743" elapsed="0.367399"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.008333" elapsed="0.367854"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:28.005691" elapsed="0.370550"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:28.387953" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.384260" elapsed="0.003744">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.005065" elapsed="0.383084">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t40" name="Modify the destination IP of Port In Old Owner After Recover" line="190">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:28.391247" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:28.390991" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.392464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.392355" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.392337" 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-07T17:17:28.397050" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.396929" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.396912" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.398093" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:28.397700" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.398605" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:28.398277" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:28.398674" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:28.398827" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:28.397332" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.404035" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.403912" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.403894" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.405277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.405172" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.405154" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.405829" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.405481" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.406313" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.406064" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.438187" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.406897" elapsed="0.031459"/>
</kw>
<msg time="2026-04-07T17:17:28.438546" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.438593" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.406516" elapsed="0.032112"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.512489" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.439199" elapsed="0.073484"/>
</kw>
<msg time="2026-04-07T17:17:28.512853" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.512900" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.438795" elapsed="0.074140"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.513261" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.513037" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.513016" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.513872" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.513501" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.514256" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.514044" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.514026" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.514390" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.516702" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:17:28.518171" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.519569" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.515244" elapsed="0.004712"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.514641" elapsed="0.005445"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.404850" elapsed="0.115338"/>
</kw>
<msg time="2026-04-07T17:17:28.520280" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.520324" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.404247" elapsed="0.116113"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.520544" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.520438" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.520419" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.521026" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.521358" elapsed="0.000059"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.521467" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.403580" elapsed="0.117996"/>
</kw>
<msg time="2026-04-07T17:17:28.521669" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.521713" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.399240" elapsed="0.122509"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.522100" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.521824" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.521807" elapsed="0.000373"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:28.399091" elapsed="0.123113"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.527580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.527473" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.527455" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.528829" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.528723" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.528705" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.529405" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.529052" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.529826" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.529586" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.561279" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.530481" elapsed="0.030969"/>
</kw>
<msg time="2026-04-07T17:17:28.561616" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.561662" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.530097" elapsed="0.031601"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.644339" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.562272" elapsed="0.082263"/>
</kw>
<msg time="2026-04-07T17:17:28.644707" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.644753" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.561863" elapsed="0.082925"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.645107" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.644867" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.644847" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.645720" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.645350" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.646106" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.645874" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.645856" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.646239" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.648570" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:17:28.649990" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.651373" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.647147" elapsed="0.004612"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.646489" elapsed="0.005383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.528422" elapsed="0.123568"/>
</kw>
<msg time="2026-04-07T17:17:28.652084" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.652132" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.527795" elapsed="0.124374"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.652353" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.652246" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.652228" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.652811" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.653151" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.653223" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.527133" elapsed="0.126196"/>
</kw>
<msg time="2026-04-07T17:17:28.653421" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.653465" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.522459" elapsed="0.131042"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.653818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.653575" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.653558" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:28.522325" elapsed="0.131593"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.659362" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.659255" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.659236" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.660615" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.660510" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.660492" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.661191" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.660819" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.661607" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.661368" elapsed="0.000265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.691462" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.662179" elapsed="0.029453"/>
</kw>
<msg time="2026-04-07T17:17:28.691798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.691844" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.661786" elapsed="0.030093"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.767367" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.692449" elapsed="0.075174"/>
</kw>
<msg time="2026-04-07T17:17:28.767800" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.767848" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.692061" elapsed="0.075824"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.768217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.767965" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.767944" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.768835" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.768456" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.769223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.769011" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.768991" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.769356" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.771684" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:17:28.773167" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.774597" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.770210" elapsed="0.004798"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.769608" elapsed="0.005516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.660208" elapsed="0.115016"/>
</kw>
<msg time="2026-04-07T17:17:28.775327" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.775371" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.659574" elapsed="0.115832"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.775589" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.775483" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.775465" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.776068" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.776391" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.776462" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.658736" elapsed="0.117832"/>
</kw>
<msg time="2026-04-07T17:17:28.776659" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.776702" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.654189" elapsed="0.122548"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.777082" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.776811" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.776794" elapsed="0.000367"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:28.654054" elapsed="0.123130"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:28.398903" elapsed="0.378314"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:28.396576" elapsed="0.380696"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:28.392074" elapsed="0.385291"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.391649" elapsed="0.385761"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:28.388935" elapsed="0.388528"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:28.785636" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.781863" elapsed="0.003811">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.388412" elapsed="0.397405">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t41" name="Verify Port Is Modified After Recover" 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-07T17:17:28.788923" elapsed="0.000223"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:28.788668" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.790161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.790052" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.790034" 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-07T17:17:28.794720" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.794614" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.794596" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.795796" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:28.795417" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.796298" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:28.795996" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:28.796368" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:28.796519" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:28.795018" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.801681" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.801575" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.801556" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.802924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.802819" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.802801" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.803539" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.803155" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.803963" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.803719" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.833519" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.804535" elapsed="0.029165"/>
</kw>
<msg time="2026-04-07T17:17:28.833866" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.833911" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.804160" elapsed="0.029786"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.888288" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.834520" elapsed="0.054110"/>
</kw>
<msg time="2026-04-07T17:17:28.888904" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:28.889078" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.834135" elapsed="0.054984"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.889641" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.889260" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.889214" elapsed="0.000554"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:28.890481" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:28.889914" elapsed="0.000652"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.890849" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.890634" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.890615" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:28.891006" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:28.893616" elapsed="0.000547"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.895128" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:28.896599" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:28.892080" elapsed="0.004942"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:28.891371" elapsed="0.005768"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.802523" elapsed="0.094720"/>
</kw>
<msg time="2026-04-07T17:17:28.897339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.897384" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.801893" elapsed="0.095527"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:28.897605" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:28.897499" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.897479" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.898127" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.898473" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.898542" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.801241" elapsed="0.097413"/>
</kw>
<msg time="2026-04-07T17:17:28.898751" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:28.898795" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.796894" elapsed="0.101937"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:28.899188" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:28.898910" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.898892" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:28.796760" elapsed="0.102528"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.904729" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.904620" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.904602" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:28.906028" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:28.905903" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:28.905885" elapsed="0.000247"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:28.906648" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:28.906275" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.907347" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:28.906828" elapsed="0.000546"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:28.940075" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:28.907920" elapsed="0.032311"/>
</kw>
<msg time="2026-04-07T17:17:28.940397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:28.940443" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.907529" elapsed="0.032948"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:29.007740" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:28.941053" elapsed="0.066952"/>
</kw>
<msg time="2026-04-07T17:17:29.008207" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:29.008258" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.940642" elapsed="0.067652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.008663" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.008395" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.008364" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.009346" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:29.008912" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.009709" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.009497" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.009478" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:29.009843" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:29.012258" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:17:29.013714" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:29.015118" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:29.010747" elapsed="0.004763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:29.010150" elapsed="0.005470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:28.905603" elapsed="0.110120"/>
</kw>
<msg time="2026-04-07T17:17:29.015832" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:29.015877" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.904942" elapsed="0.110971"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:29.016115" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:29.016006" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.015986" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.016588" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.017005" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.017078" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:28.904267" elapsed="0.112922"/>
</kw>
<msg time="2026-04-07T17:17:29.017290" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:29.017334" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.899582" elapsed="0.117788"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.017692" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.017446" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.017428" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:28.899431" elapsed="0.118362"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.024481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:29.024372" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.024353" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.025756" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:29.025651" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.025633" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:29.026336" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:29.025960" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:29.026757" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:29.026514" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:29.056617" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:29.027338" elapsed="0.029456"/>
</kw>
<msg time="2026-04-07T17:17:29.056988" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:29.057037" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:29.026935" elapsed="0.030136"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:29.123682" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:29.057631" elapsed="0.066236"/>
</kw>
<msg time="2026-04-07T17:17:29.124074" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:29.124122" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:29.057243" elapsed="0.066914"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.124452" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.124235" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.124215" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.125114" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:29.124690" elapsed="0.000507"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.125474" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.125263" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.125245" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:29.125605" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:29.127912" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:17:29.129388" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:29.130781" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:29.126477" elapsed="0.004713"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:29.125853" elapsed="0.005449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:29.025349" elapsed="0.106051"/>
</kw>
<msg time="2026-04-07T17:17:29.131490" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:29.131533" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:29.024695" elapsed="0.106872"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:29.131747" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:29.131642" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.131624" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.132249" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.132572" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.132641" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:29.024026" elapsed="0.108721"/>
</kw>
<msg time="2026-04-07T17:17:29.132837" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:29.132880" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:29.018074" elapsed="0.114840"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.133258" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.133016" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:29.132997" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:29.017921" elapsed="0.115436"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:28.796595" elapsed="0.336790"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:28.794257" elapsed="0.339181"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:28.789753" elapsed="0.343741"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:28.789346" elapsed="0.344192"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:28.786666" elapsed="0.346924"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.140238" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:29.139833" elapsed="0.000433"/>
</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-07T17:17:29.149997" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:29.149604" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.150484" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:29.150181" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:29.150554" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:29.150706" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:29.149240" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.156052" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:29.155740" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:29.156154" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:29.156315" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:29.155405" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.162429" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:29.162183" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:29.162858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:29.162618" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:29.179075" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:29.179283" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:29.179424" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:29.165027" elapsed="0.014979">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:29.162980" elapsed="0.017139">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.180472" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:29.180166" elapsed="0.000403"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:29.162948" elapsed="0.017655">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.181136" elapsed="0.000040"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.181403" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:29.181315" elapsed="0.000178"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:29.181272" elapsed="0.000269"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:29.181844" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.182025" elapsed="0.000034"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:29.156670" elapsed="0.025587">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:29.182388" elapsed="0.000032"/>
</return>
<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="FAIL" start="2026-04-07T17:17:29.154909" elapsed="0.027676">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:29.183138" elapsed="0.000054"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:29.150955" elapsed="0.032355">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:29.150819" elapsed="0.032689">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:29.148582" elapsed="0.035131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:30.200859" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:30.200298" elapsed="0.000603"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:30.201424" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:30.201093" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:30.201503" elapsed="0.000058"/>
</return>
<msg time="2026-04-07T17:17:30.201705" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:30.199877" elapsed="0.001852"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:30.207106" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:30.206789" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:30.207179" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:30.207325" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:30.206442" elapsed="0.000907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:30.213769" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:30.213507" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:30.214291" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:30.213979" elapsed="0.000371"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:30.224546" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:30.224711" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:30.224827" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:30.216410" elapsed="0.008866">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:30.214434" elapsed="0.010930">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:30.225556" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:30.225402" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:30.214408" elapsed="0.011237">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:30.226035" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:30.226244" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:30.226206" elapsed="0.000080"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:30.226187" elapsed="0.000121"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:30.226476" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:30.226548" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:30.207703" elapsed="0.018954">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:30.226720" elapsed="0.000018"/>
</return>
<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="FAIL" start="2026-04-07T17:17:30.205926" elapsed="0.020889">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:30.227067" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:30.201959" elapsed="0.025186">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:30.201799" elapsed="0.025407">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:30.198944" elapsed="0.028355">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:31.242964" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:31.242476" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:31.243497" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:31.243184" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:31.243572" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:17:31.243748" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:31.242082" elapsed="0.001691"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:31.249103" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:31.248788" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:31.249175" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:31.249321" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:31.248445" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:31.255735" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:31.255479" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:31.256187" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:31.255929" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:31.267888" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:31.268053" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:31.268221" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:31.258222" elapsed="0.010420">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:31.256318" elapsed="0.012408">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:31.268912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:31.268761" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:31.256286" elapsed="0.012732">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:31.269380" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:31.269552" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:31.269475" elapsed="0.000169"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:31.269458" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:31.270032" elapsed="0.000049"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:31.270188" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:31.249685" elapsed="0.020731">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:31.270566" elapsed="0.000039"/>
</return>
<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="FAIL" start="2026-04-07T17:17:31.247940" elapsed="0.022853">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:31.271326" elapsed="0.000053"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:31.243995" elapsed="0.027502">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:31.243833" elapsed="0.027792">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:31.241240" elapsed="0.030585">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:32.287626" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:32.287135" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:32.288159" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:32.287831" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:32.288234" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:17:32.288411" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:32.286725" elapsed="0.001710"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:32.293800" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:32.293499" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:32.293952" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:17:32.294134" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:32.293160" elapsed="0.000999"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:32.300585" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:32.300325" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:32.301039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:32.300780" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:32.311100" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:32.311254" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:32.311364" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:32.303074" elapsed="0.008761">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:32.301159" elapsed="0.010791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:32.312234" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:32.312020" elapsed="0.000306"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:32.301137" elapsed="0.011222">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:32.312869" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:32.313078" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:32.313026" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:32.313000" elapsed="0.000168"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:32.313360" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:32.313457" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:32.294504" elapsed="0.019100">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:32.313692" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:17:32.292660" elapsed="0.021163">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:32.314178" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:32.288642" elapsed="0.025646">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:32.288496" elapsed="0.025874">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:32.285885" elapsed="0.028673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:33.330050" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:33.329555" elapsed="0.000529"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:33.330562" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:33.330251" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:33.330637" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:17:33.330862" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:33.329168" elapsed="0.001724"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:33.336204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:33.335887" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:33.336283" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:33.336438" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:33.335524" elapsed="0.000939"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:33.342825" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:33.342563" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:33.343280" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:33.343035" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:33.353218" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:33.353364" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:33.353470" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:33.345416" elapsed="0.008452">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:33.343398" elapsed="0.010555">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:33.354159" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:33.354005" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:33.343377" elapsed="0.010870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:33.354619" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:33.354752" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:33.354716" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:33.354699" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:33.355067" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:33.355141" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:33.336805" elapsed="0.018441">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:33.355307" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:17:33.335044" elapsed="0.020354">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:33.355629" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:33.331113" elapsed="0.024593">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:33.330953" elapsed="0.024844">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:33.328361" elapsed="0.027532">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:17:34.371707" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:34.371194" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.372263" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:34.371916" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:34.372341" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:17:34.372521" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:34.370766" elapsed="0.001781"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.377905" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:34.377590" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:34.377996" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:34.378148" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:34.377224" elapsed="0.000950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.384590" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.384334" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.385046" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.384786" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:34.399703" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:34.399881" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:17:34.400265" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.387092" elapsed="0.013983">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:34.385163" elapsed="0.016094">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.401703" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.401363" elapsed="0.000486"/>
</branch>
<status status="FAIL" start="2026-04-07T17:17:34.385143" elapsed="0.016757">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.402727" elapsed="0.000057"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.403053" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.402941" elapsed="0.000207"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:34.402904" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.403507" elapsed="0.000047"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.403663" elapsed="0.000033"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.378527" elapsed="0.025369">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.404065" elapsed="0.000034"/>
</return>
<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="FAIL" start="2026-04-07T17:17:34.376712" elapsed="0.027564">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:17:34.404815" elapsed="0.000056"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:17:34.372749" elapsed="0.032310">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:17:34.372606" elapsed="0.032596">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.369853" elapsed="0.035577">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:17:34.405647" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:17:29.140453" elapsed="5.265401">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:29.137756" elapsed="5.268380">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:28.786146" elapsed="5.620315">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2F9a5df812-eb49-4477-a37e-2d464c02791d%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s1-t42" name="Delete Port In Old Owner After Recover" 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-07T17:17:34.411594" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:34.411336" elapsed="0.000524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.412849" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.412739" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.412720" 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-07T17:17:34.417740" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.417632" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.417614" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.418787" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:34.418409" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.419290" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:34.418986" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:34.419360" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:34.419513" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:34.418039" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.424591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.424482" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.424463" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.425908" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.425801" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.425784" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:34.426509" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.426143" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.426944" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:34.426691" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.456246" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:34.427527" elapsed="0.028884"/>
</kw>
<msg time="2026-04-07T17:17:34.456586" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:34.456632" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.427146" elapsed="0.029521"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.519911" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:34.457252" elapsed="0.062945"/>
</kw>
<msg time="2026-04-07T17:17:34.520403" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:34.520453" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.456835" elapsed="0.063653"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.520841" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.520592" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.520559" elapsed="0.000426"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.521604" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.521133" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.522087" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.521822" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.521797" elapsed="0.000404"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:34.522235" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:34.524839" elapsed="0.000559"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.526384" elapsed="0.000645"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:34.527951" elapsed="0.000384"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:34.523229" elapsed="0.005183"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:34.522541" elapsed="0.006002"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:34.425501" elapsed="0.103155"/>
</kw>
<msg time="2026-04-07T17:17:34.528748" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.528791" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.424802" elapsed="0.104033"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:34.529080" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-07T17:17:34.528931" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.528911" elapsed="0.000278"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.529674" elapsed="0.000032"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.530084" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.530164" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:34.424149" elapsed="0.106127"/>
</kw>
<msg time="2026-04-07T17:17:34.530379" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.530435" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.419889" elapsed="0.110583"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.530818" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.530550" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.530532" elapsed="0.000386"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:34.419753" elapsed="0.111193"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.536573" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.536462" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.536444" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.537907" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.537787" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.537766" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:34.538491" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.538136" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.538912" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:34.538669" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.576244" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:34.539488" elapsed="0.036925"/>
</kw>
<msg time="2026-04-07T17:17:34.576629" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:34.576676" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.539110" elapsed="0.037600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.645271" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:34.577293" elapsed="0.068488"/>
</kw>
<msg time="2026-04-07T17:17:34.646229" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:34.646360" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.576878" elapsed="0.069563"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.647220" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.646627" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.646581" elapsed="0.000866"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.648610" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.647755" elapsed="0.001029"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.649435" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.648933" elapsed="0.000665"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.648893" elapsed="0.000780"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:34.649747" elapsed="0.000059"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:34.654473" elapsed="0.000655"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.656140" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:34.657626" elapsed="0.000555"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:34.651651" elapsed="0.006618"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:34.650332" elapsed="0.008054"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:34.537414" elapsed="0.121099"/>
</kw>
<msg time="2026-04-07T17:17:34.658623" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.658675" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.536787" elapsed="0.121925"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:34.658922" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:34.658810" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.658786" elapsed="0.000270"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.659475" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.659858" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.659945" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:34.536110" elapsed="0.124069"/>
</kw>
<msg time="2026-04-07T17:17:34.660294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.660341" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.531250" elapsed="0.129127"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.660787" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.660511" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.660486" elapsed="0.000392"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:34.531090" elapsed="0.129819"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.666652" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.666530" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.666510" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.668108" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.667951" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.667932" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:34.668730" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.668337" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.669243" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:34.668937" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.701306" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:34.669933" elapsed="0.031565"/>
</kw>
<msg time="2026-04-07T17:17:34.701689" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:34.701773" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.669452" elapsed="0.032365"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.755878" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:34.702468" elapsed="0.053647"/>
</kw>
<msg time="2026-04-07T17:17:34.756305" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:34.756352" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.702030" elapsed="0.054356"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.756708" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.756476" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.756452" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.757344" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.756951" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.757700" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.757489" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.757471" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:34.757848" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:34.760177" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:17:34.761624" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:34.763057" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:34.758714" elapsed="0.004734"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:34.758132" elapsed="0.005429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:34.667601" elapsed="0.096060"/>
</kw>
<msg time="2026-04-07T17:17:34.763816" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.763860" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.666904" elapsed="0.096991"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:34.764095" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:34.763986" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.763953" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.764560" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.765109" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.765183" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:34.666152" elapsed="0.099139"/>
</kw>
<msg time="2026-04-07T17:17:34.765383" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.765426" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.661221" elapsed="0.104240"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.765776" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.765534" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.765518" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:34.661063" elapsed="0.104830"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:34.419587" elapsed="0.346337"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:34.417244" elapsed="0.348752"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:34.412454" elapsed="0.353599"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.412025" elapsed="0.354075"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:34.408640" elapsed="0.357515"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:34.777762" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.774094" elapsed="0.003715">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.407371" elapsed="0.370588">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t43" name="Delete Bridge In Old Owner And Verify After Recover" line="202">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:34.781193" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:34.780915" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.782446" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.782338" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.782320" 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-07T17:17:34.787025" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.786905" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.786888" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.788079" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:34.787677" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.788559" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:34.788259" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:34.788629" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:34.788780" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:34.787309" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.796078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.795952" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.795933" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.797357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.797250" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.797232" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:34.797958" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.797563" elapsed="0.000438"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.798409" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:34.798157" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.827786" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:34.798986" elapsed="0.028972"/>
</kw>
<msg time="2026-04-07T17:17:34.828147" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:34.828194" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.798592" elapsed="0.029636"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.892842" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:34.828781" elapsed="0.064771"/>
</kw>
<msg time="2026-04-07T17:17:34.894140" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:34.894253" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.828395" elapsed="0.065938"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.895089" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.894566" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.894504" elapsed="0.000698"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:34.895840" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:34.895349" elapsed="0.000578"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.896226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.896011" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.895991" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:34.896363" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:34.898895" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:17:34.900393" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:34.901800" elapsed="0.000378"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:34.897352" elapsed="0.004905"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:34.896697" elapsed="0.005679"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:34.796924" elapsed="0.105554"/>
</kw>
<msg time="2026-04-07T17:17:34.902575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.902620" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.796294" elapsed="0.106361"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:34.902933" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:34.902818" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.902797" elapsed="0.000289"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.903503" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.903851" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.903923" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:34.795603" elapsed="0.108453"/>
</kw>
<msg time="2026-04-07T17:17:34.904156" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:34.904200" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.789224" elapsed="0.115011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:34.904562" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:34.904315" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.904297" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:34.789086" elapsed="0.115577"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.910325" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.910208" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.910188" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:34.911598" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:34.911492" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:34.911474" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:34.912186" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:34.911803" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.912619" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:34.912373" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:34.944506" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:34.913195" elapsed="0.031493"/>
</kw>
<msg time="2026-04-07T17:17:34.944854" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:34.944899" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.912800" elapsed="0.032134"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.019291" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:34.945501" elapsed="0.073986"/>
</kw>
<msg time="2026-04-07T17:17:35.019660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:35.019707" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.945115" elapsed="0.074627"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.020068" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.019821" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.019801" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.020691" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:35.020312" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.021109" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.020880" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.020862" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:35.021244" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.023557" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:17:35.025002" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:35.026434" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:35.022102" elapsed="0.004723"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:35.021501" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:34.911193" elapsed="0.115882"/>
</kw>
<msg time="2026-04-07T17:17:35.027166" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.027210" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.910536" elapsed="0.116709"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:35.027427" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:35.027321" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.027303" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.027890" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.028253" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.028326" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:34.909804" elapsed="0.118628"/>
</kw>
<msg time="2026-04-07T17:17:35.028524" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.028568" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.904937" elapsed="0.123666"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.028917" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.028676" elapsed="0.000497"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.028660" elapsed="0.000540"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:34.904801" elapsed="0.124422"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.034411" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.034302" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.034283" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.035649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.035543" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.035526" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:35.036232" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:35.035851" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.036650" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:35.036409" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.067729" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:35.037275" elapsed="0.030628"/>
</kw>
<msg time="2026-04-07T17:17:35.068180" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:35.068227" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.036827" elapsed="0.031435"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.132026" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:35.068817" elapsed="0.063407"/>
</kw>
<msg time="2026-04-07T17:17:35.132393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:35.132439" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.068428" elapsed="0.064046"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.132769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.132551" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.132531" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.133408" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:35.133025" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.133768" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.133560" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.133541" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:35.133900" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.136222" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:17:35.137650" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:35.139072" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:35.134767" elapsed="0.004691"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:35.134165" elapsed="0.005405"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:35.035247" elapsed="0.104422"/>
</kw>
<msg time="2026-04-07T17:17:35.139758" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.139802" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.034624" elapsed="0.105213"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:35.140036" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:35.139913" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.139895" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.140497" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.140823" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.140894" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:35.033923" elapsed="0.107098"/>
</kw>
<msg time="2026-04-07T17:17:35.141113" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.141157" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.029478" elapsed="0.111714"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.141560" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.141314" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.141296" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:35.029345" elapsed="0.112315"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:34.788897" elapsed="0.352792"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:34.786551" elapsed="0.355198"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:34.782055" elapsed="0.359753"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:34.781599" elapsed="0.360255"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:34.778945" elapsed="0.362963"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:17:35.153759" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:17:35.150014" elapsed="0.003784">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:17:34.778343" elapsed="0.375607">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s1-t44" name="Cleans Up Test Environment For Next Suite" line="206">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:35.157129" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:35.156856" 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-07T17:17:35.158380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.158243" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.158225" 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-07T17:17:35.163023" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.162899" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.162882" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.164073" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:35.163681" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.164551" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:35.164254" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:35.164620" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:35.164772" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:35.163310" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.170066" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.169942" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.169924" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.171355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.171247" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.171229" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:35.171912" level="INFO">${karaf_connection_index} = 10</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:35.171560" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.172353" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:35.172110" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.201217" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:35.172906" elapsed="0.028666"/>
</kw>
<msg time="2026-04-07T17:17:35.201954" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:35.202114" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.172531" elapsed="0.029997"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.255856" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:35.203912" elapsed="0.052153"/>
</kw>
<msg time="2026-04-07T17:17:35.256235" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:35.256281" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.202917" elapsed="0.053399"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.256612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.256394" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.256374" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.257253" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:35.256851" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.257608" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.257399" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.257381" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:35.257739" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.260051" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:35.261474" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:35.262855" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:35.258599" elapsed="0.004659"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:35.258004" elapsed="0.005364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:35.170921" elapsed="0.092546"/>
</kw>
<msg time="2026-04-07T17:17:35.263556" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.263600" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.170280" elapsed="0.093354"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:35.263814" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:35.263709" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.263691" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.264293" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.264619" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.264688" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:35.169603" elapsed="0.095192"/>
</kw>
<msg time="2026-04-07T17:17:35.264885" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.264928" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.165168" elapsed="0.099824"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.265316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.265071" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.265053" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:35.165033" elapsed="0.100420"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.270890" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.270783" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.270765" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.272161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.272053" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.272034" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:35.272717" level="INFO">${karaf_connection_index} = 12</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:35.272367" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.273154" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:35.272895" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.305262" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:35.273710" elapsed="0.031721"/>
</kw>
<msg time="2026-04-07T17:17:35.305596" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:35.305642" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.273334" elapsed="0.032343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.376909" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:35.306257" elapsed="0.070934"/>
</kw>
<msg time="2026-04-07T17:17:35.377393" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:35.377439" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.305844" elapsed="0.071630"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.377806" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.377564" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.377541" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.378472" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:35.378078" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.378855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.378644" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.378624" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:35.379005" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.381317" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:17:35.382754" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:35.384134" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:35.379846" elapsed="0.004675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:35.379268" elapsed="0.005365"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:35.271728" elapsed="0.113003"/>
</kw>
<msg time="2026-04-07T17:17:35.384830" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.384945" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.271121" elapsed="0.113876"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:35.385183" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:35.385076" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.385057" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.385645" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.385995" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.386069" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:35.270433" elapsed="0.115744"/>
</kw>
<msg time="2026-04-07T17:17:35.386274" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.386317" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.265708" elapsed="0.120645"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.386698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.386428" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.386410" elapsed="0.000368"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:35.265573" elapsed="0.121228"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.392235" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.392129" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.392111" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.393514" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:35.393408" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.393390" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:35.394086" level="INFO">${karaf_connection_index} = 14</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:35.393719" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.394507" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:35.394264" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.424252" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:35.395104" elapsed="0.029318"/>
</kw>
<msg time="2026-04-07T17:17:35.424590" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:35.424636" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.394711" elapsed="0.029960"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.496483" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:35.425253" elapsed="0.071555"/>
</kw>
<msg time="2026-04-07T17:17:35.497087" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:35.497137" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.424833" elapsed="0.072341"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.497653" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.497300" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.497260" elapsed="0.000505"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.498404" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:35.497912" elapsed="0.000680"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.498904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.498663" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.498644" elapsed="0.000378"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:35.499060" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.501541" elapsed="0.000543"/>
</kw>
<kw name="Open 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-07T17:17:35.503034" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:35.504445" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:35.500022" elapsed="0.004823"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:35.499374" elapsed="0.005588"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:35.393106" elapsed="0.111975"/>
</kw>
<msg time="2026-04-07T17:17:35.505178" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.505223" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.392448" elapsed="0.112811"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:35.505445" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:35.505338" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.505318" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.505933" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.506302" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:35.506374" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:35.391772" elapsed="0.114710"/>
</kw>
<msg time="2026-04-07T17:17:35.506580" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:35.506624" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.387080" elapsed="0.119580"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:35.507026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.506736" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.506719" elapsed="0.000385"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:35.386920" elapsed="0.120208"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:35.164851" elapsed="0.342312"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:35.162544" elapsed="0.344681"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:35.157944" elapsed="0.349343"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:35.157534" elapsed="0.349802"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:35.154818" elapsed="0.352576"/>
</kw>
<kw name="Configure Exit OVSDB Connection" owner="ClusterOvsdb">
<kw name="Clean OVSDB Test Environment" owner="OVSDB">
<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-07T17:17:35.512744" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:35.512483" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:35.512465" elapsed="0.000397"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.513168" 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-07T17:17:35.513269" 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-07T17:17:35.513024" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.513820" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:17:35.513441" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.514510" level="INFO">${conn_id} = 203</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-07T17:17:35.514137" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:35.515474" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:35.515551" 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-07T17:17:35.515175" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.515730" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.516892" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:35.953065" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:20 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:35.516576" elapsed="0.436688"/>
</kw>
<msg time="2026-04-07T17:17:35.953355" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.516226" elapsed="0.437217"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:35.514746" elapsed="0.438818"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:35.954119" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:17:37.092360" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:37.092786" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:37.092888" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:35.953825" elapsed="1.139121"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.093484" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.095232" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:37.094550" elapsed="0.000803"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.095832" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:37.095535" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.095480" elapsed="0.000548"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:37.096382" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-07T17:17:37.096150" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.096116" elapsed="0.000461"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.096654" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.101948" elapsed="0.000360"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:37.102472" elapsed="0.000172"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.102788" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:37.097520" elapsed="0.005419"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:35.511944" elapsed="1.591114"/>
</kw>
<msg time="2026-04-07T17:17:37.103119" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:35.511398" elapsed="1.591779"/>
</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="PASS" start="2026-04-07T17:17:35.510761" elapsed="1.592500"/>
</kw>
<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-07T17:17:37.105353" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:37.105080" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.105061" elapsed="0.000374"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.105728" 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-07T17:17:37.105831" 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-07T17:17:37.105585" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.106398" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:17:37.106020" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.106979" level="INFO">${conn_id} = 205</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-07T17:17:37.106595" elapsed="0.000411"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.107896" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:37.107985" 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-07T17:17:37.107609" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.108164" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.109360" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:37.478535" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:35 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:37.109042" elapsed="0.369680"/>
</kw>
<msg time="2026-04-07T17:17:37.478814" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.108645" elapsed="0.370259"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:37.107220" elapsed="0.371829"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.479611" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:17:37.512588" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:17:37.512963" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:37.513106" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:37.479330" elapsed="0.033828"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.513561" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.515200" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:37.514527" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.515782" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:37.515481" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.515425" elapsed="0.000523"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:37.516349" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:17:37.516108" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.516072" elapsed="0.000463"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.516610" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.521138" elapsed="0.000492"/>
</kw>
<kw name="Open 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-07T17:17:37.521858" elapsed="0.000248"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.522311" elapsed="0.000139"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:37.517404" elapsed="0.005118"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:37.104521" elapsed="0.418132"/>
</kw>
<msg time="2026-04-07T17:17:37.522728" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.103933" elapsed="0.418865"/>
</kw>
<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="PASS" start="2026-04-07T17:17:37.103436" elapsed="0.419480"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:17:35.510417" elapsed="2.012615"/>
</kw>
<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-07T17:17:37.526064" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:37.525674" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.525649" elapsed="0.000529"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.526559" 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-07T17:17:37.526662" 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-07T17:17:37.526403" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.527231" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.56" 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-07T17:17:37.526835" elapsed="0.000442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.527793" level="INFO">${conn_id} = 207</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-07T17:17:37.527428" elapsed="0.000390"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.528725" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:37.528801" 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-07T17:17:37.528442" elapsed="0.000382"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.528991" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.530157" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:37.903927" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:37 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:37.529828" elapsed="0.374388"/>
</kw>
<msg time="2026-04-07T17:17:37.904309" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.529482" elapsed="0.374917"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:37.528047" elapsed="0.376473"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.905100" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-04-07T17:17:37.968173" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:37.968329" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:37.968432" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:37.904803" elapsed="0.063680"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.968830" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.969897" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:37.969565" elapsed="0.000375"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.970216" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:37.970054" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.970022" elapsed="0.000277"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:37.970459" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:37.970355" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.970340" elapsed="0.000204"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:37.970578" 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-07T17:17:37.973414" elapsed="0.000352"/>
</kw>
<kw name="Open 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-07T17:17:37.973930" elapsed="0.000185"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:37.974260" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:37.970922" elapsed="0.003487"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:37.524882" elapsed="0.449618"/>
</kw>
<msg time="2026-04-07T17:17:37.974555" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.524066" elapsed="0.450540"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl del-manager</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:37.523303" elapsed="0.451386"/>
</kw>
<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-07T17:17:37.976799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:37.976518" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:37.976499" elapsed="0.000382"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.977192" 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-07T17:17:37.977297" 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-07T17:17:37.977046" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.977861" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.56" 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-07T17:17:37.977470" elapsed="0.000437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.978442" level="INFO">${conn_id} = 209</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-07T17:17:37.978074" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:37.979370" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:37.979446" 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-07T17:17:37.979082" elapsed="0.000387"/>
</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-07T17:17:37.979673" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:37.980848" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:38.292725" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:37 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:37.980531" elapsed="0.312311"/>
</kw>
<msg time="2026-04-07T17:17:38.292913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.980180" elapsed="0.312820"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:37.978679" elapsed="0.314426"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.293543" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-04-07T17:17:38.457332" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:38.457523" level="INFO">${stdout} =  * Exiting ovs-vswitchd (889)
 * Exiting ovsdb-server (852)</msg>
<msg time="2026-04-07T17:17:38.457615" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:38.293311" elapsed="0.164351"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:38.458028" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.458947" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:38.458661" elapsed="0.000344"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:38.459231" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:38.459090" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.459065" elapsed="0.000242"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:38.459464" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:38.459360" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.459345" elapsed="0.000202"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:38.459579" 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-07T17:17:38.462323" elapsed="0.000329"/>
</kw>
<kw name="Open 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-07T17:17:38.462812" elapsed="0.000175"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:38.463132" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:38.459906" elapsed="0.003374"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:37.975986" elapsed="0.487383"/>
</kw>
<msg time="2026-04-07T17:17:38.463423" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:37.975401" elapsed="0.488072"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl stop</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:37.974887" elapsed="0.488668"/>
</kw>
<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-07T17:17:38.465615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:38.465355" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.465336" elapsed="0.000361"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.465996" 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-07T17:17:38.466100" 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-07T17:17:38.465843" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.466741" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.56" 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-07T17:17:38.466360" elapsed="0.000426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.467319" level="INFO">${conn_id} = 211</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-07T17:17:38.466938" elapsed="0.000407"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.468242" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:38.468318" 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-07T17:17:38.467943" elapsed="0.000399"/>
</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-07T17:17:38.468499" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.469655" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:38.780366" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:38 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:38.469345" elapsed="0.311154"/>
</kw>
<msg time="2026-04-07T17:17:38.780578" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:38.468997" elapsed="0.311655"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:38.467556" elapsed="0.313204"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.781262" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-04-07T17:17:38.793452" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:38.793575" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:38.793620" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:38.781005" elapsed="0.012638"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:38.793814" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.794595" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:38.794283" elapsed="0.000354"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:38.794875" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:38.794726" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.794699" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:38.795129" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:38.795022" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.795007" elapsed="0.000205"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:38.795245" 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-07T17:17:38.798004" elapsed="0.000325"/>
</kw>
<kw name="Open 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-07T17:17:38.798490" elapsed="0.000178"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:38.798813" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:38.795571" elapsed="0.003389"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:38.464818" elapsed="0.334256"/>
</kw>
<msg time="2026-04-07T17:17:38.799128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:38.464262" elapsed="0.334915"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo rm -rf /etc/openvswitch/conf.db</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:38.463752" elapsed="0.335571"/>
</kw>
<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-07T17:17:38.801572" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:38.801302" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:38.801283" elapsed="0.000369"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.801934" 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-07T17:17:38.802053" 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-07T17:17:38.801796" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.802634" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.56" 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-07T17:17:38.802228" elapsed="0.000454"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.803220" level="INFO">${conn_id} = 213</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-07T17:17:38.802834" elapsed="0.000411"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:38.804150" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:38.804226" 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-07T17:17:38.803848" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:38.804401" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:38.805762" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:39.134891" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:38 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:38.805264" elapsed="0.329806"/>
</kw>
<msg time="2026-04-07T17:17:39.135155" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:38.804879" elapsed="0.330360"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:38.803460" elapsed="0.331893"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:39.135871" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-04-07T17:17:39.279796" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:39.280081" level="INFO">${stdout} =  * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * system ID not configured, please use --system-id
 * Configuring Open vSwitch ...</msg>
<msg time="2026-04-07T17:17:39.280185" level="INFO">${stderr} = 2026-04-07T17:17:39Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:17:39Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:17:39Z|00001|dns_res...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:39.135607" elapsed="0.144631"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:39.280616" elapsed="0.000493"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.282189" level="INFO">2026-04-07T17:17:39Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:17:39Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:17:39Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.281527" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.282763" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:39.282471" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.282417" elapsed="0.000507"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:39.283361" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:17:39.283077" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.283041" elapsed="0.000560"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.283654" elapsed="0.000020"/>
</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-07T17:17:39.287453" elapsed="0.000449"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.288146" elapsed="0.000219"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:39.288565" elapsed="0.000134"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.284123" elapsed="0.004646"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:38.800760" elapsed="0.488135"/>
</kw>
<msg time="2026-04-07T17:17:39.288990" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:38.800192" elapsed="0.488870"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl start</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:38.799520" elapsed="0.489657"/>
</kw>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>General Use Keyword attempting to sanitize test environment for OVSDB related
tests. Not every step will always be neccessary, but should not cause any problems for
any new ovsdb test suites.</doc>
<status status="PASS" start="2026-04-07T17:17:35.510029" elapsed="3.779226"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.289941" level="INFO">${dictionary} = {'ovsdb://uuid': '0'}</msg>
<var>${dictionary}</var>
<arg>ovsdb://uuid=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.289498" elapsed="0.000500"/>
</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-07T17:17:39.296430" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:39.296041" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.296919" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:39.296614" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:39.297004" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:39.297157" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:39.295659" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.302722" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.302422" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.302793" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.302940" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.302078" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.309148" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.308887" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.309578" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.309340" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.319440" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node07haaqe1ld0p21w38k7w7sm12n0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:39.319663" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:39.319828" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:39.311586" elapsed="0.008279"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.309686" elapsed="0.010237"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.320192" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.319960" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.309667" elapsed="0.010699"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.324887" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.321765" elapsed="0.003186"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.321467" elapsed="0.003550"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.321441" elapsed="0.003612"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.328428" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.325433" elapsed="0.003058"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.325131" elapsed="0.003408"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.325108" elapsed="0.003465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.329342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.328790" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.329800" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.329477" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.330597" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.330151" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.329914" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.329452" elapsed="0.001272"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.331470" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.330936" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.331923" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.331603" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.332685" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.332273" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.332056" elapsed="0.000714"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.331578" elapsed="0.001221"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.333019" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:39.334151" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.333724" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.334397" elapsed="0.002630"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:39.320861" elapsed="0.016229"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:39.337265" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:39.337160" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.337141" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.337491" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.337561" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:17:39.339734" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:39.303331" elapsed="0.036431"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:39.339812" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.339960" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:39.301579" elapsed="0.038421"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.341203" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:39.340793" elapsed="0.000477"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:17:39.340631" elapsed="0.000713"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:39.340502" elapsed="0.000877"/>
</for>
<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="PASS" start="2026-04-07T17:17:39.340237" elapsed="0.001197"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:39.297393" elapsed="0.044074"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.346651" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.346350" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.346722" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:39.346866" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.346013" elapsed="0.000878"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.353047" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.352784" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.353480" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.353240" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.371928" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0qddl0oectjyk5mtojq46vlel0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:39.372093" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:39.372183" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:39.355515" elapsed="0.016693"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.353590" elapsed="0.018660"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.372422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.372276" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.353571" elapsed="0.018936"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.376075" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.373493" elapsed="0.002647"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.373280" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.373262" elapsed="0.002960"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.379586" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.376606" elapsed="0.003043"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.376299" elapsed="0.003396"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.376276" elapsed="0.003453"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.380478" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.379941" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.380926" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.380611" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.381690" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.381277" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.381062" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.380586" elapsed="0.001219"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.382539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.382036" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.383076" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.382671" elapsed="0.000488"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.383744" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.383442" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.383224" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.382646" elapsed="0.001181"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.384025" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:39.384810" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.384535" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.385000" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:39.372848" elapsed="0.014328"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:39.387372" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-07T17:17:39.387256" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.387238" elapsed="0.000236"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.387621" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.387689" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:39.389818" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:39.347236" elapsed="0.042609"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:39.389896" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:39.390064" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:39.345518" elapsed="0.044571"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.391284" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:39.390846" elapsed="0.000504"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:17:39.390699" elapsed="0.000691"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:39.390571" elapsed="0.000848"/>
</for>
<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="PASS" start="2026-04-07T17:17:39.390308" elapsed="0.001162"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:39.341554" elapsed="0.049949"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.396653" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.396357" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.396724" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.396867" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.396021" elapsed="0.000870"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.402985" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.402727" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.403436" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.403180" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.418993" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0vr8838e3zt1fy12hkt3bk1cz0.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:39.419097" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:17:39.419190" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:39.405571" elapsed="0.013656"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.403545" elapsed="0.015726"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.419446" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.419297" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.403526" elapsed="0.016071"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.426927" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.421929" elapsed="0.005132"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.421441" elapsed="0.005697"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.421399" elapsed="0.005794"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.429774" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:39.427672" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.427384" elapsed="0.002468"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.427344" elapsed="0.002533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.430416" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.430045" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.430739" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.430511" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.431296" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.430987" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.430819" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.430494" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.431892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.431535" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.432231" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.432003" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.432753" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.432463" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.432311" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.431984" elapsed="0.000851"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.432992" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:39.433755" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:39.433488" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.433929" elapsed="0.002139"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:39.420378" elapsed="0.015752"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:17:39.436303" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:39.436198" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.436180" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.436526" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.436595" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:17:39.438716" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:39.397221" elapsed="0.041522"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:39.438793" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:39.438940" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:17:39.395531" elapsed="0.043447"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.440132" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:17:39.439750" elapsed="0.000445"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:17:39.439605" elapsed="0.000629"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:17:39.439477" elapsed="0.000786"/>
</for>
<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="PASS" start="2026-04-07T17:17:39.439197" elapsed="0.001116"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:39.391589" elapsed="0.048792"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:39.297242" elapsed="0.143170"/>
</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 {'ovsdb://uuid': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:17:39.295079" elapsed="0.145384"/>
</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-07T17:17:39.290250" elapsed="0.150265"/>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="PASS" start="2026-04-07T17:17:35.507617" elapsed="3.932961"/>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="PASS" start="2026-04-07T17:17:35.154280" elapsed="4.286421"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-07T17:17:39.441864" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-07T17:17:39.441784" elapsed="0.000169"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Owner failover and recover</doc>
<status status="FAIL" start="2026-04-07T17:15:51.343499" elapsed="108.098502"/>
</suite>
<suite id="s1-s1-s2" name="Southbound Cluster Extension" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster/020__Southbound_Cluster_Extension.robot">
<kw name="Suite Setup" 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-07T17:17:39.522096" 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-07T17:17:39.518223" elapsed="0.003921"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-07T17:17:39.517800" elapsed="0.004423"/>
</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-07T17:17:39.526752" 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-07T17:17:39.523295" elapsed="0.003484"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-07T17:17:39.526980" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:39.526857" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.526836" elapsed="0.000213"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.527572" 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-07T17:17:39.527196" elapsed="0.000418"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.528093" level="INFO">${cluster_size} = 3</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-07T17:17:39.527770" elapsed="0.000348"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Convert To Integer" owner="BuiltIn">
<arg>${cluster_size}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:39.528608" elapsed="0.000275"/>
</kw>
<msg time="2026-04-07T17:17:39.528993" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:39.529041" level="INFO">${possibly_int_of_members} = 3</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-07T17:17:39.528279" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.529587" level="INFO">${int_of_members} = 3</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-07T17:17:39.529226" elapsed="0.000386"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.530563" 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-07T17:17:39.530303" elapsed="0.000286"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.530993" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:39.530730" elapsed="0.000290"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.531467" 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-07T17:17:39.531173" elapsed="0.000320"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.534349" elapsed="0.000201"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.535039" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.534704" elapsed="0.000361"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.535213" elapsed="0.000261"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.536252" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.535945" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.536323" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:17:39.536476" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.535660" elapsed="0.000840"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.537304" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.175:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899d8e9d0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:17:39.536703" elapsed="0.000737"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.537598" elapsed="0.000190"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:17:39.533787" elapsed="0.004061"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:39.533606" elapsed="0.004286"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.538719" elapsed="0.000185"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.539406" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.539071" elapsed="0.000362"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.539576" elapsed="0.000217"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.540567" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.540277" elapsed="0.000315"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.540636" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.540784" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.539992" elapsed="0.000816"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.541374" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.171.205:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a01b3b50&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:17:39.540954" elapsed="0.000522"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.541630" elapsed="0.000187"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:17:39.538170" elapsed="0.003704"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:39.537991" elapsed="0.003926"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.542730" elapsed="0.000184"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.543423" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.543079" elapsed="0.000370"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.543592" elapsed="0.000217"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.544578" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:39.544290" elapsed="0.000314"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:39.544647" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.544793" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:39.544006" elapsed="0.000812"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:39.545380" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.206:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899bf7450&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:17:39.544978" elapsed="0.000504"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.545636" elapsed="0.000184"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:17:39.542190" elapsed="0.003686"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:39.542016" elapsed="0.003902"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-07T17:17:39.531542" elapsed="0.014405"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.546573" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</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-07T17:17:39.546171" elapsed="0.000444"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.547185" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.175', 2: '10.30.171.205', 3: '10.30.170.206'}</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-07T17:17:39.546771" elapsed="0.000457"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.547778" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</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-07T17:17:39.547398" elapsed="0.000422"/>
</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-07T17:17:39.529849" elapsed="0.018027"/>
</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-07T17:17:39.522944" elapsed="0.024986"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:39.548123" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:39.548010" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.547991" elapsed="0.000198"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.551241" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:39.550850" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.551748" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:39.551443" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:39.551817" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:39.551983" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:39.550534" elapsed="0.001474"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:39.552951" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:39.552693" elapsed="0.000299"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:39.553711" 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-07T17:17:39.553811" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:39.553549" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:39.557324" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:39.556661" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:39.556617" elapsed="0.000884"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:39.558157" 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-07T17:17:39.558426" 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-07T17:17:39.557769" elapsed="0.000756"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.559479" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.175" 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-07T17:17:39.558786" elapsed="0.000853"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:39.560637" level="INFO">${conn_id} = 215</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-07T17:17:39.559899" elapsed="0.000838"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:39.562103" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:39.562179" 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-07T17:17:39.561822" elapsed="0.000381"/>
</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-07T17:17:39.562464" elapsed="0.000324"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:39.563828" level="INFO">Logging into '10.30.170.175:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:40.166066" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:17:39 UTC 2026

  System load:  0.24               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.175
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:15:52 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:39.563381" elapsed="0.602803"/>
</kw>
<msg time="2026-04-07T17:17:40.166256" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.563012" elapsed="0.603319"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:39.561123" elapsed="0.605437"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.167447" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:17:40.180255" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:17:40.180737" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:40.181156" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:40.166919" elapsed="0.014487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.182119" elapsed="0.001219"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.186138" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:40.184884" elapsed="0.001645"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:40.187558" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:40.186873" elapsed="0.000860"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.186765" elapsed="0.001130"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:40.188812" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:17:40.188454" elapsed="0.000472"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.188358" elapsed="0.000661"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:40.189119" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.192438" elapsed="0.000403"/>
</kw>
<kw name="Open 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-07T17:17:40.193122" elapsed="0.000230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.193599" elapsed="0.000167"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:40.189708" elapsed="0.004136"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:39.555633" elapsed="0.638508"/>
</kw>
<msg time="2026-04-07T17:17:40.194258" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.554958" elapsed="0.639355"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:17:39.554492" elapsed="0.639900"/>
</kw>
<msg time="2026-04-07T17:17:40.194432" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:39.554001" elapsed="0.640476"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.197083" elapsed="0.000309"/>
</kw>
<kw name="Open 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-07T17:17:40.197603" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.197889" elapsed="0.000113"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:40.194759" elapsed="0.003294"/>
</kw>
<msg time="2026-04-07T17:17:40.198145" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:17:39.553203" elapsed="0.644966"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.198584" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:40.198337" elapsed="0.000292"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:17:40.198671" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:17:39.552351" elapsed="0.646442"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:39.552182" elapsed="0.646650"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:40.199750" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:40.199480" elapsed="0.000296"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.200610" 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-07T17:17:40.200709" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.200473" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:40.206207" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:40.205507" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.205462" elapsed="0.000933"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.207103" 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-07T17:17:40.207395" 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-07T17:17:40.206678" elapsed="0.000827"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.208474" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.205" 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-07T17:17:40.207778" elapsed="0.000924"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.209809" level="INFO">${conn_id} = 218</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-07T17:17:40.209024" elapsed="0.000897"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.211391" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:40.211468" 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-07T17:17:40.211111" elapsed="0.000380"/>
</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-07T17:17:40.211696" elapsed="0.000365"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.212947" level="INFO">Logging into '10.30.171.205:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:40.787037" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:17:40 UTC 2026

  System load:  0.49               Processes:             123
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.205
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:15:52 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:40.212628" elapsed="0.574573"/>
</kw>
<msg time="2026-04-07T17:17:40.787291" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.212273" elapsed="0.575198"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:40.210323" elapsed="0.577391"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.788616" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:17:40.802029" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:17:40.802634" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:40.802948" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:40.788110" elapsed="0.015096"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.803807" elapsed="0.001125"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.807415" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:40.806239" elapsed="0.001547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:40.808869" elapsed="0.000067"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:40.808170" elapsed="0.000898"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.808060" elapsed="0.001158"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:40.809864" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:17:40.809514" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.809428" elapsed="0.000637"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:40.810156" elapsed="0.000018"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.813800" elapsed="0.000419"/>
</kw>
<kw name="Open 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-07T17:17:40.814468" elapsed="0.000227"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.814932" elapsed="0.000251"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:40.810738" elapsed="0.004522"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:40.204413" elapsed="0.611097"/>
</kw>
<msg time="2026-04-07T17:17:40.815620" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.203639" elapsed="0.612034"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:17:40.201400" elapsed="0.614361"/>
</kw>
<msg time="2026-04-07T17:17:40.815803" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.200884" elapsed="0.614966"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.818404" elapsed="0.000308"/>
</kw>
<kw name="Open 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-07T17:17:40.818873" elapsed="0.000227"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.819245" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:40.816158" elapsed="0.003234"/>
</kw>
<msg time="2026-04-07T17:17:40.819484" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:17:40.200114" elapsed="0.619396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.819931" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:40.819683" elapsed="0.000303"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:17:40.820030" elapsed="0.000028"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:17:40.199126" elapsed="0.621028"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:40.198929" elapsed="0.621264"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:40.821141" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:40.820851" elapsed="0.000355"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.821923" 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-07T17:17:40.822039" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:40.821779" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:40.825574" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:40.824934" elapsed="0.000745"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:40.824892" elapsed="0.000856"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.826407" 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-07T17:17:40.826672" 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-07T17:17:40.826032" elapsed="0.000740"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.827688" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" 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-07T17:17:40.827077" elapsed="0.000772"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.828883" level="INFO">${conn_id} = 221</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-07T17:17:40.828134" elapsed="0.000865"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:40.830377" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:40.830453" 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-07T17:17:40.830091" elapsed="0.000386"/>
</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-07T17:17:40.830673" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:40.832212" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:41.470561" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:17:41 UTC 2026

  System load:  0.18               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:15:53 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:40.831756" elapsed="0.638981"/>
</kw>
<msg time="2026-04-07T17:17:41.470832" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.831219" elapsed="0.639710"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:40.829363" elapsed="0.641862"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.472248" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:17:41.484564" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:17:41.485059" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:41.485345" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:41.471651" elapsed="0.013868"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.486057" elapsed="0.001237"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.490087" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.488728" elapsed="0.001751"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:41.491760" elapsed="0.000079"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:41.490838" elapsed="0.001112"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.490724" elapsed="0.001430"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:41.493130" elapsed="0.000195"/>
</return>
<status status="PASS" start="2026-04-07T17:17:41.492481" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.492387" elapsed="0.001224"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:41.493833" elapsed="0.000018"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:41.497336" elapsed="0.000413"/>
</kw>
<kw name="Open 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-07T17:17:41.498148" elapsed="0.000243"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.498643" elapsed="0.000169"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:41.494540" elapsed="0.004350"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:40.823893" elapsed="0.675296"/>
</kw>
<msg time="2026-04-07T17:17:41.499310" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.823257" elapsed="0.676110"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:17:40.822712" elapsed="0.676738"/>
</kw>
<msg time="2026-04-07T17:17:41.499492" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:40.822216" elapsed="0.677323"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:41.502148" elapsed="0.000308"/>
</kw>
<kw name="Open 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-07T17:17:41.502615" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.502902" elapsed="0.000112"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:41.499825" elapsed="0.003240"/>
</kw>
<msg time="2026-04-07T17:17:41.503161" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:17:40.821424" elapsed="0.681763"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.503607" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.503359" elapsed="0.000290"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:17:41.503690" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:17:40.820480" elapsed="0.683339"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:40.820297" elapsed="0.683563"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:39.552058" elapsed="1.951842"/>
</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-07T17:17:39.548400" elapsed="1.955576"/>
</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-07T17:17:41.504133" elapsed="0.000210"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:41.517394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:41.517281" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.517260" elapsed="0.000203"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.517755" 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-07T17:17:41.517857" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.517613" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.518308" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.518049" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.518741" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.518500" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:41.519605" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:17:41.519372" elapsed="0.000349">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-07T17:17:41.519827" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:41.519872" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:41.518993" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:41.520209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:41.519987" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.519952" elapsed="0.000357"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:41.521050" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.520769" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:41.521122" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:41.521284" level="INFO">${odl_ip} = 10.30.170.175</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:41.520505" elapsed="0.000803"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.521455" elapsed="0.000402"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.522169" level="INFO">index=224
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:17:41.522267" level="INFO">${karaf_connection_object} = index=224
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.522041" elapsed="0.000252"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.522438" elapsed="0.002035"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.524888" level="INFO">Logging into '10.30.170.175:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:17:41.806140" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.524632" elapsed="0.281684"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:41.810180" elapsed="0.000431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.810778" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.811135" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:41.807545" elapsed="0.003748"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:41.806775" elapsed="0.004565"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.516962" elapsed="0.294430"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:17:41.505077" elapsed="0.306367"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:41.504696" elapsed="0.306805"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:41.504559" elapsed="0.307055"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:41.824131" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:41.824007" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.823980" elapsed="0.000228"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.824495" 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-07T17:17:41.824604" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.824358" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.825060" level="INFO">{1: 224}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.824778" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:41.825493" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:41.825251" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:41.826333" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:17:41.826091" elapsed="0.000360">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-07T17:17:41.826558" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:41.826603" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:41.825715" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:41.826927" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:41.826701" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:41.826682" elapsed="0.000359"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:41.827767" level="INFO">${ip_address} = 10.30.171.205</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.827505" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:41.827845" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:17:41.828020" level="INFO">${odl_ip} = 10.30.171.205</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:41.827237" elapsed="0.000808"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.828197" elapsed="0.000405"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.828892" level="INFO">index=226
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:17:41.829006" level="INFO">${karaf_connection_object} = index=226
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.828768" elapsed="0.000265"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.829176" elapsed="0.002071"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:17:41.831667" level="INFO">Logging into '10.30.171.205:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:17:42.072796" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:17:41.831407" elapsed="0.241486"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.075825" elapsed="0.000416"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.076405" elapsed="0.000199"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.076752" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.073747" elapsed="0.003154"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.073166" elapsed="0.003780"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:17:41.823696" elapsed="0.253324"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:17:41.812256" elapsed="0.264812"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:41.811866" elapsed="0.265253"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:41.811725" elapsed="0.265435"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.089521" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.089409" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.089388" elapsed="0.000205"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.089905" 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-07T17:17:42.090025" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.089768" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.090465" level="INFO">{1: 224, 2: 226}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.090204" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.090896" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.090656" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.091685" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:17:42.091466" elapsed="0.000322">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-07T17:17:42.091894" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:42.091939" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.091107" elapsed="0.000855"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.092271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.092053" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.092035" elapsed="0.000333"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.093110" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.092827" elapsed="0.000309"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:42.093184" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:42.093335" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.092564" elapsed="0.000795"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.093508" elapsed="0.000426"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.094245" level="INFO">index=228
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:17:42.094344" level="INFO">${karaf_connection_object} = index=228
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.094119" elapsed="0.000250"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.094511" elapsed="0.002205"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.097157" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:17:42.467304" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.096877" elapsed="0.370602"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.470565" elapsed="0.000395"/>
</kw>
<kw name="Open 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-07T17:17:42.471144" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.471443" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.468412" elapsed="0.003182"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.467795" elapsed="0.003844"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.089126" elapsed="0.382565"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:17:42.077764" elapsed="0.393974"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.077384" elapsed="0.394406"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:42.077250" elapsed="0.394582"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-07T17:17:41.504403" elapsed="0.967468"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-07T17:17:39.522505" elapsed="2.949433"/>
</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-07T17:17:42.474455" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.474340" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.474319" 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-07T17:17:42.479071" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.478940" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.478923" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.480095" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:42.479690" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.480578" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:42.480278" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:42.480646" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:42.480806" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:42.479363" elapsed="0.001468"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.486023" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.485900" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.485882" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.487398" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.487216" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.487198" elapsed="0.000338"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.488109" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.487677" elapsed="0.000472"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.488629" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:42.488384" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.527660" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:42.490306" elapsed="0.037500"/>
</kw>
<msg time="2026-04-07T17:17:42.527987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:42.528065" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.488893" elapsed="0.039266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.584536" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:42.529799" elapsed="0.054909"/>
</kw>
<msg time="2026-04-07T17:17:42.584867" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:42.584942" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.528423" elapsed="0.056590"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.585506" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.585182" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.585160" elapsed="0.000519"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.586403" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.585819" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.586999" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.586664" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.586644" elapsed="0.000528"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:42.587205" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.589035" elapsed="0.000309"/>
</kw>
<kw name="Open 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-07T17:17:42.589547" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.589882" elapsed="0.000115"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.588364" elapsed="0.001742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.587460" elapsed="0.002761"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:42.486846" elapsed="0.103477"/>
</kw>
<msg time="2026-04-07T17:17:42.590413" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.590458" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.486249" elapsed="0.104246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:42.590678" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:42.590573" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.590554" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.591220" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.591600" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.591673" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:42.485613" elapsed="0.106168"/>
</kw>
<msg time="2026-04-07T17:17:42.591873" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.591917" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.481226" elapsed="0.110730"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.592396" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.592112" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.592094" elapsed="0.000383"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:42.481087" elapsed="0.111414"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.597653" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.597545" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.597527" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.599104" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.598898" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.598880" elapsed="0.000364"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.599812" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.599385" elapsed="0.000469"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.600342" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:42.600101" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.639001" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:42.601942" elapsed="0.037200"/>
</kw>
<msg time="2026-04-07T17:17:42.639295" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:42.639367" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.600602" elapsed="0.038818"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.693052" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:42.641014" elapsed="0.052276"/>
</kw>
<msg time="2026-04-07T17:17:42.693503" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:42.693604" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.639672" elapsed="0.054004"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.694401" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.693906" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.693876" elapsed="0.000765"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.695478" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.694842" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.696056" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.695733" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.695713" elapsed="0.000513"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:42.696258" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.698076" elapsed="0.000329"/>
</kw>
<kw name="Open 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-07T17:17:42.698609" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.698948" elapsed="0.000130"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.697408" elapsed="0.001779"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.696511" elapsed="0.002767"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:42.598514" elapsed="0.100897"/>
</kw>
<msg time="2026-04-07T17:17:42.699506" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.699551" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.597868" elapsed="0.101721"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:42.699774" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:42.699667" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.699648" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.700332" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.700712" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.700785" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:42.597252" elapsed="0.103640"/>
</kw>
<msg time="2026-04-07T17:17:42.701000" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.701045" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.592758" elapsed="0.108324"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.701402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.701158" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.701141" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:42.592622" elapsed="0.108881"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.706690" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.706581" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.706563" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.708166" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.707950" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.707932" elapsed="0.000371"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.708851" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.708443" elapsed="0.000448"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.709375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:42.709137" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.749252" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:42.710991" elapsed="0.038415"/>
</kw>
<msg time="2026-04-07T17:17:42.749558" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:42.749631" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.709634" elapsed="0.040050"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.804311" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:42.751339" elapsed="0.053132"/>
</kw>
<msg time="2026-04-07T17:17:42.804620" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:42.804692" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.749939" elapsed="0.054802"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.805233" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.804901" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.804880" elapsed="0.000560"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.806130" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.805583" elapsed="0.000671"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.806708" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.806399" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.806357" elapsed="0.000520"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:42.806913" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.808762" elapsed="0.000321"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.809284" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.809616" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.808120" elapsed="0.001698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.807193" elapsed="0.002722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:42.707603" elapsed="0.102426"/>
</kw>
<msg time="2026-04-07T17:17:42.810121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.810165" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.706905" elapsed="0.103297"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:42.810395" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:42.810278" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.810260" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.810892" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.811296" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.811369" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:42.706278" elapsed="0.105200"/>
</kw>
<msg time="2026-04-07T17:17:42.811571" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.811615" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.701756" elapsed="0.109896"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.812051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.811726" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.811709" elapsed="0.000423"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:42.701623" elapsed="0.110532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:42.480891" elapsed="0.331293"/>
</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-07T17:17:42.478648" elapsed="0.333590"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-07T17:17:42.472535" elapsed="0.339759"/>
</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-07T17:17:42.472109" elapsed="0.340226"/>
</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-07T17:17:39.517492" elapsed="3.294898"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.813372" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-07T17:17:42.813042" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-07T17:17:42.813601" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:42.813505" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.813487" elapsed="0.000193"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.813829" elapsed="0.000022"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.814017" elapsed="0.000021"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.814190" elapsed="0.000020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.814363" elapsed="0.000043"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.814639" elapsed="0.000025"/>
</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-07T17:17:42.812653" elapsed="0.002072"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:39.517186" elapsed="3.297589"/>
</kw>
<test id="s1-s1-s2-t1" name="Check Shards Status Before Fail" line="17">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:42.818218" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:42.817938" 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-07T17:17:42.819476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.819367" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.819349" 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-07T17:17:42.824085" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.823978" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.823948" elapsed="0.000203"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.825118" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:42.824730" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.825618" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:42.825299" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:42.825688" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:42.825841" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:42.824366" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.831007" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.830882" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.830863" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.832259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.832153" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.832135" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.832811" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.832462" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.833252" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:42.833008" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.866468" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:42.833808" elapsed="0.032823"/>
</kw>
<msg time="2026-04-07T17:17:42.866809" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:42.866855" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.833433" elapsed="0.033501"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.924643" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:42.867566" elapsed="0.057268"/>
</kw>
<msg time="2026-04-07T17:17:42.925026" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:42.925076" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.867179" elapsed="0.057934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.925418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.925194" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.925173" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:42.926052" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:42.925658" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.926415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.926202" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.926185" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:42.926578" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:42.928850" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.930291" elapsed="0.000541"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:42.931769" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:42.927429" elapsed="0.004751"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:42.926830" elapsed="0.005463"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:42.831827" elapsed="0.100566"/>
</kw>
<msg time="2026-04-07T17:17:42.932484" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.932528" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.831221" elapsed="0.101345"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:42.932749" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:42.932641" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.932623" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.933229" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.933553" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.933623" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:42.830547" elapsed="0.103184"/>
</kw>
<msg time="2026-04-07T17:17:42.933822" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:42.933866" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.826236" elapsed="0.107668"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:42.934248" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:42.933992" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.933961" elapsed="0.000401"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:42.826098" elapsed="0.108288"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.939645" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.939537" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.939519" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:42.940902" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:42.940796" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:42.940778" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:42.941476" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:42.941124" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.941902" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:42.941657" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:42.975615" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:42.942479" elapsed="0.033296"/>
</kw>
<msg time="2026-04-07T17:17:42.975958" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:42.976021" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.942098" elapsed="0.033962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:43.033526" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:42.976611" elapsed="0.057102"/>
</kw>
<msg time="2026-04-07T17:17:43.033880" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:43.033927" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.976226" elapsed="0.057756"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.034277" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.034060" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.034041" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.034918" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.034513" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.035303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.035092" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.035074" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:43.035433" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.039303" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.040755" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:43.042174" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.037818" elapsed="0.004747"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:43.035683" elapsed="0.007030"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:42.940495" elapsed="0.102318"/>
</kw>
<msg time="2026-04-07T17:17:43.042905" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:43.042953" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.939859" elapsed="0.103179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:43.043226" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.043119" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.043100" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.043689" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.044046" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.044119" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:42.939199" elapsed="0.105026"/>
</kw>
<msg time="2026-04-07T17:17:43.044315" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:43.044357" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.934665" elapsed="0.109729"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.044712" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.044468" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.044451" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:42.934526" elapsed="0.110285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.049897" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.049791" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.049773" elapsed="0.000333"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.051318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.051212" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.051194" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.051874" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.051523" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:43.052314" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:43.052067" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:43.084812" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:43.052876" elapsed="0.032105"/>
</kw>
<msg time="2026-04-07T17:17:43.085167" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:43.085213" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:43.052496" elapsed="0.032754"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:43.144155" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:43.085802" elapsed="0.058565"/>
</kw>
<msg time="2026-04-07T17:17:43.144551" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:43.144596" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:43.085416" elapsed="0.059217"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.144987" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.144721" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.144695" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.145620" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.145236" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.146049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.145822" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.145804" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:43.146185" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.148591" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:17:43.150072" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:43.151491" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.147110" elapsed="0.004776"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:43.146469" elapsed="0.005549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:43.050885" elapsed="0.101236"/>
</kw>
<msg time="2026-04-07T17:17:43.152213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:43.152257" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:43.050257" elapsed="0.102038"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:43.152479" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.152372" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.152354" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.152953" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.153545" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.153620" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:43.049456" elapsed="0.104272"/>
</kw>
<msg time="2026-04-07T17:17:43.153820" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:43.153863" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:43.045176" elapsed="0.108724"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.154254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.154005" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.153958" elapsed="0.000374"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:43.044930" elapsed="0.109426"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:42.825916" elapsed="0.328472"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:42.823611" elapsed="0.330835"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:42.819083" elapsed="0.335418"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:42.818637" elapsed="0.335910"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:42.815641" elapsed="0.338958"/>
</kw>
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:17:43.174385" elapsed="0.000236"/>
</kw>
<msg time="2026-04-07T17:17:43.174670" 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-07T17:17:43.173759" elapsed="0.000977"/>
</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 [['topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.173312" elapsed="0.001500"/>
</kw>
<msg time="2026-04-07T17:17:43.174895" 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-07T17:17:43.165403" elapsed="0.009537"/>
</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-07T17:17:43.165016" elapsed="0.010016"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.175455" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.175204" elapsed="0.000296"/>
</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-07T17:17:43.180434" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.180050" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.180916" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.180615" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:43.181002" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.181157" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.179670" 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-07T17:17:43.181332" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.181990" 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-07T17:17:43.181641" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.182406" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.182170" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.182822" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.182574" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.185487" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.185143" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:43.185558" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.185704" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.184790" elapsed="0.000938"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.233935" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.233564" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.234786" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.234462" elapsed="0.000408">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.234962" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.234137" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.235544" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.235164" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.235864" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:43.236055" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:43.235728" elapsed="0.000353"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.236515" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.236271" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.237641" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.237387" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.238132" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.237843" elapsed="0.000314"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.238468" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.238667" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.238853" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.238338" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.238203" elapsed="0.000741"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:43.239002" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:43.239160" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:43.236915" elapsed="0.002270"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.236627" elapsed="0.002590"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.239382" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.239241" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.236607" elapsed="0.002850"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.240055" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.239597" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.240128" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.232951" elapsed="0.007298"/>
</kw>
<msg time="2026-04-07T17:17:43.240303" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.221256" elapsed="0.019153"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.252058" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.263652" elapsed="0.000058"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.275265" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.275655" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.276054" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.276595" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.276451" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:43.276436" 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-07T17:17:43.276809" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.276986" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.277151" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.276405" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.276269" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.277540" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.277692" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.277880" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:43.215705" elapsed="0.062224"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.280250" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.280007" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.280501" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.279582" elapsed="0.000962"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.281065" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.280682" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.281710" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.281411" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.281203" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.280642" elapsed="0.001206"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.284493" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.282162" elapsed="0.002378"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:43.284634" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:17:43.284915" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.278761" elapsed="0.006260"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.287273" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.287033" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.287526" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.286599" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:43.287927" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.287709" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.287668" elapsed="0.000433"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.288395" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.288766" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.288910" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.290926" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.285791" elapsed="0.005197"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.294513" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.294184" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.295288" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.294948" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.313409" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.313841" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:17:43 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:43.314163" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.297610" elapsed="0.016581"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.295518" elapsed="0.018742"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.314520" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.314320" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.295478" elapsed="0.019181"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.318743" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.316220" elapsed="0.002789"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.315999" elapsed="0.003047"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.315962" elapsed="0.003108"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.321599" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.319343" elapsed="0.002301"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.319126" elapsed="0.002552"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.319109" elapsed="0.002593"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.322286" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.321864" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.322615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.322384" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.323197" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.322875" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.322697" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.322365" elapsed="0.000915"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.323792" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.323432" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.324150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.323887" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.324677" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.324383" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.324232" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.323869" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.324902" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.325708" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.325419" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.325882" elapsed="0.002134"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.315391" elapsed="0.012772"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.328487" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.328300" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.328260" elapsed="0.000346"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.334672" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.328899" elapsed="0.005821"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.334817" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:17:43.335135" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.291790" elapsed="0.043395"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.335404" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.335657" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.193413" elapsed="0.142270"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.336040" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.335767" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.335750" elapsed="0.000774"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.336558" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:43.189507" elapsed="0.147175"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.185794" elapsed="0.150930"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.185777" elapsed="0.150971"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.337390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.337284" elapsed="0.000150"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:43.337554" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.337456" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.337266" elapsed="0.000368"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.337774" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:17:43.337892" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:43.337020" elapsed="0.000897"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.338458" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.338092" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.339134" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.338634" elapsed="0.000527"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.345262" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.344705" elapsed="0.000639"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.346059" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.345510" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.359347" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.359448" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":94,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:17:38.186","LastApplied":238,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":238,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.392","active":true,"matchIndex":238,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":239},{"timeSinceLastActivity":"00:00:00.392","active":true,"matchIndex":238,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":239}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"876.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":63,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":24,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:43.359598" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.350869" elapsed="0.008779"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.346224" elapsed="0.013574"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.360032" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.359828" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.346205" elapsed="0.014092"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.364383" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":94,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:17:38.186","LastApplied":238,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":238,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.392","active":true,"matchIndex":238,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":239},{"timeSinceLastActivity":"00:00:00.392","active":true,"matchIndex":238,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":239}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"876.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":63,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":24,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.362145" elapsed="0.002350"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.361653" elapsed="0.002909"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.361612" elapsed="0.003018"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.367458" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.365281" elapsed="0.002271"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.364771" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.364731" elapsed="0.002954"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.369046" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.368237" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.369766" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.369281" elapsed="0.000609"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.370786" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.370318" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.369956" elapsed="0.000981"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.369240" elapsed="0.001788"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.372346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.371562" elapsed="0.000881"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.373169" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.372580" elapsed="0.000713"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.374190" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.373705" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.373359" elapsed="0.000945"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.372539" elapsed="0.001828"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.374663" elapsed="0.000644"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.376183" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.375572" elapsed="0.000711"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.376544" elapsed="0.002509"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.360738" elapsed="0.018421"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.379400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.379255" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.379236" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.382810" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.379675" elapsed="0.003164"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.383174" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:17:43.383338" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.340108" elapsed="0.043256"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.383421" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:43.383565" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.339373" elapsed="0.044219"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.384665" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.384163" elapsed="0.000531"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:43.384742" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.384919" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:43.383807" elapsed="0.001138"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.385322" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 238, 'CommittedTransactionsCount': 63, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.385114" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.385694" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.385497" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:43.385765" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:43.385912" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:43.184193" elapsed="0.201743"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:43.386008" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:43.386154" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:17:43.183458" elapsed="0.202720"/>
</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-07T17:17:43.386464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.386255" 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="PASS" start="2026-04-07T17:17:43.386744" elapsed="0.000211"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.386544" elapsed="0.000516"/>
</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-07T17:17:43.387229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.387086" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.386238" elapsed="0.001065"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:43.183125" elapsed="0.204202"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.389814" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.389471" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:43.389886" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.390050" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.389137" elapsed="0.000939"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.438278" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.437889" elapsed="0.000476"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.439098" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.438857" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.439253" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.438530" elapsed="0.000747"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.439813" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.439435" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.440144" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:43.440275" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:43.440008" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.440694" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.440453" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.441808" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.441554" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.442288" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.442023" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.442621" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.442818" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.443020" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.442493" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.442361" elapsed="0.000749"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:43.443152" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.443309" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:43.441105" elapsed="0.002229"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.440804" elapsed="0.002561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.443530" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.443389" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.440785" elapsed="0.002821"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.444181" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.443741" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.444255" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.437288" elapsed="0.007089"/>
</kw>
<msg time="2026-04-07T17:17:43.444428" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.425553" elapsed="0.018981"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.456248" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.467957" elapsed="0.000079"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.479571" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.479983" elapsed="0.000057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.480363" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.480859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.480720" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:43.480705" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.481091" 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-07T17:17:43.481253" 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-07T17:17:43.481412" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.480676" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.480543" elapsed="0.000957"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.481795" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.481947" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:17:43.482156" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:43.420098" elapsed="0.062107"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.484519" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.484279" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.484769" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.483849" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.485316" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.484950" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.485955" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.485657" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.485452" elapsed="0.000603"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.484909" elapsed="0.001201"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.488756" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.486407" elapsed="0.002394"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:43.488895" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:43.489243" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.483062" elapsed="0.006229"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.491575" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.491338" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.491825" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.490894" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:43.492242" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.492023" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.491979" elapsed="0.000420"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.492692" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.493180" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.493324" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.495185" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.490106" elapsed="0.005128"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.498650" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.498324" elapsed="0.000421"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.499434" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.499107" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.524149" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.524574" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:17:43 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:43.524816" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.501750" elapsed="0.023093"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.499663" elapsed="0.025247"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.525193" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.524990" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.499622" elapsed="0.025710"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.529402" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.526765" elapsed="0.002839"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.526549" elapsed="0.003090"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.526528" elapsed="0.003136"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.532062" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.529935" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.529720" elapsed="0.002421"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.529703" elapsed="0.002463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.532687" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.532319" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.533026" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.532784" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.533558" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.533262" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.533109" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.532765" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.534213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.533792" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.534534" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.534309" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.535100" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.534766" elapsed="0.000360"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.534615" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.534291" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.535324" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.536113" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.535822" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.536286" elapsed="0.002101"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.526010" elapsed="0.012548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.538885" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.538697" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.538656" elapsed="0.000398"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.544935" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.539347" elapsed="0.005652"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.545098" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:43.545382" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.495950" elapsed="0.049482"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.545650" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.545900" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.397722" elapsed="0.148205"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.546287" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.546026" elapsed="0.000687"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.546008" elapsed="0.000734"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.546776" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:43.393815" elapsed="0.153085"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.390148" elapsed="0.156794"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.390130" elapsed="0.156850"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.547621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.547516" elapsed="0.000149"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:43.547786" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.547687" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.547499" elapsed="0.000367"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.548042" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:17:43.548163" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:43.547253" elapsed="0.000935"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.548712" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.548347" elapsed="0.000391"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.549361" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.548886" elapsed="0.000502"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.555450" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.554878" elapsed="0.000654"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.556312" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.555696" elapsed="0.000696"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.569194" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.569297" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":238,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":238,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"612.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:43.569446" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.561091" elapsed="0.008404"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.556475" elapsed="0.013170"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.569849" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.569675" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.556456" elapsed="0.013653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.574205" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":238,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":238,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"612.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.571960" elapsed="0.002354"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.571453" elapsed="0.002929"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.571411" elapsed="0.003038"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.577302" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.575128" elapsed="0.002267"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.574590" elapsed="0.002872"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.574551" elapsed="0.002978"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.578853" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.578080" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.579677" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.579190" elapsed="0.000611"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.580694" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.580225" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.579867" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.579148" elapsed="0.001724"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.582207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.581421" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.582926" elapsed="0.000148"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.582440" elapsed="0.000708"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.584041" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.583558" elapsed="0.000529"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.583214" elapsed="0.000941"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.582400" elapsed="0.001819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.584516" elapsed="0.000638"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.586032" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.585423" elapsed="0.000709"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.586388" elapsed="0.002459"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.570545" elapsed="0.018408"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.589214" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.589071" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.589051" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.592652" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.589489" elapsed="0.003192"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.592779" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:43.592935" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.550322" elapsed="0.042682"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.593065" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:43.593214" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.549595" elapsed="0.043644"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.594274" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.593781" elapsed="0.000521"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:43.594349" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.594519" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:43.593450" elapsed="0.001095"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.594888" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 238, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.594692" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.595410" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.595208" elapsed="0.000228"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:43.595483" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:43.595631" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:43.388528" elapsed="0.207127"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:43.595711" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:43.595853" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:43.387641" elapsed="0.208236"/>
</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="PASS" start="2026-04-07T17:17:43.596177" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.595953" elapsed="0.000450"/>
</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-07T17:17:43.596567" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.596428" 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-07T17:17:43.596779" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.596644" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.595936" elapsed="0.000916"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:43.387479" elapsed="0.209397"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.600435" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.600094" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:43.600506" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.600653" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.599743" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.648795" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.648377" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.649527" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.649319" elapsed="0.000271">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.649718" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.648991" elapsed="0.000751"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.650298" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.649900" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.650610" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:43.650737" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:43.650478" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.651184" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.650911" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.652311" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.651891" elapsed="0.000464"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.652774" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.652512" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.653131" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.653331" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.653495" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.653000" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.652847" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:43.653624" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.653780" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:43.651579" elapsed="0.002226"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.651296" elapsed="0.002540"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.654018" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.653860" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.651277" elapsed="0.002818"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.654649" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.654230" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.654724" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.647761" elapsed="0.007084"/>
</kw>
<msg time="2026-04-07T17:17:43.654896" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.636147" elapsed="0.018879"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.666718" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.678428" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.690077" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.690474" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.690854" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.691395" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.691254" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:43.691239" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.691609" 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-07T17:17:43.691770" 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-07T17:17:43.691929" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.691204" elapsed="0.000794"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.691057" elapsed="0.000978"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.692337" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.692490" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.692679" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:43.630696" elapsed="0.062033"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.695051" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.694796" elapsed="0.000318">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.695333" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.694383" elapsed="0.000995"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.695843" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.695517" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.696551" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.696254" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.696045" elapsed="0.000590"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.695475" elapsed="0.001215"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.699195" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.697007" elapsed="0.002234"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:43.699337" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:43.699617" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.693566" elapsed="0.006099"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.702012" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.701757" elapsed="0.000320">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.702306" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.701347" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:43.702711" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.702490" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.702449" elapsed="0.000420"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.703208" elapsed="0.000057"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.703587" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.703732" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.705828" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.700534" elapsed="0.005345"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.709412" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.709083" elapsed="0.000424"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.710177" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.709834" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.733703" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.734342" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:17:43 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:43.734551" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.712511" elapsed="0.022066"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.710407" elapsed="0.024238"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.734901" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.734704" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.710366" elapsed="0.024698"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.739011" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.736525" elapsed="0.002774"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.736309" elapsed="0.003031"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.736288" elapsed="0.003080"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.742447" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.739649" elapsed="0.002860"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.739426" elapsed="0.003131"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.739408" elapsed="0.003183"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.743366" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.742804" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.743819" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.743500" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.744652" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.744232" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.743934" elapsed="0.000803"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.743475" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.745498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.744996" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.745944" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.745630" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.746702" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.746298" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.746085" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.745605" elapsed="0.001212"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.747034" elapsed="0.000491"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.748147" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.747744" elapsed="0.000439"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.748386" elapsed="0.002995"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.735752" elapsed="0.015834"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.752096" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.751779" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.751720" elapsed="0.000527"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.758302" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.752540" elapsed="0.005810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.758447" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:43.758733" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.706626" elapsed="0.052157"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.759021" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:43.759304" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.608377" elapsed="0.150954"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.759664" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.759414" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.759397" elapsed="0.000767"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.760197" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:43.604460" elapsed="0.155860"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.600744" elapsed="0.159618"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.600727" elapsed="0.159658"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.761044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.760900" elapsed="0.000188"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:43.761211" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.761110" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.760883" elapsed="0.000406"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.761427" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:17:43.761545" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:43.760637" elapsed="0.000933"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.762114" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.761728" elapsed="0.000413"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.762741" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.762290" elapsed="0.000478"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.768688" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.768150" elapsed="0.000620"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.769550" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.768935" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.782523" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.782626" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Follower","LastApplied":238,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":238,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"335.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:43.782775" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.774413" elapsed="0.008412"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.769712" elapsed="0.013284"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.783237" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.783033" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.769693" elapsed="0.013778"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.789276" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":237,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":237,"Leader":"member-1-shard-topology-operational","LastIndex":238,"RaftState":"Follower","LastApplied":238,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":238,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"335.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":238,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":67494},"timestamp":1775582263,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.785888" elapsed="0.003539"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.785187" elapsed="0.004334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.785129" elapsed="0.004485"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.793172" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.790499" elapsed="0.002768"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.789813" elapsed="0.003522"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.789756" elapsed="0.003645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.794726" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.793933" elapsed="0.000890"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.795481" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.794962" elapsed="0.000643"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.796563" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.796091" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.795671" elapsed="0.001005"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.794921" elapsed="0.001819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.798074" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.797288" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.798798" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.798309" elapsed="0.000613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.799850" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.799382" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.799006" elapsed="0.001018"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.798268" elapsed="0.001825"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.800393" elapsed="0.000641"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.801894" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.801303" elapsed="0.000704"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.802268" elapsed="0.002511"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.783913" elapsed="0.020972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.805142" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.804995" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.804961" elapsed="0.000316"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.808571" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.805419" elapsed="0.003181"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.808699" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:43.808857" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.763717" elapsed="0.045198"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.808990" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:17:43.809146" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.762987" elapsed="0.046184"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.810214" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.809717" elapsed="0.000526"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:43.810291" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.810462" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755822...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:43.809385" elapsed="0.001103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.810831" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 238, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.810636" elapsed="0.000222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:43.811232" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.811021" elapsed="0.000237"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:43.811305" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:43.811453" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:43.599145" elapsed="0.212332"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:43.811532" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:43.811675" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:43.597210" elapsed="0.214489"/>
</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="PASS" start="2026-04-07T17:17:43.812084" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.811775" elapsed="0.000537"/>
</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-07T17:17:43.812477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.812337" 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-07T17:17:43.812688" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.812553" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.811758" elapsed="0.001002"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:43.597048" elapsed="0.215736"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:43.182909" elapsed="0.629902"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:43.812850" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:43.813063" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:17:43.813109" level="INFO">${follower_list} = [2, 3]</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-07T17:17:43.178948" elapsed="0.634184"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.813566" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:17:43.813641" level="INFO">${leader_count} = 1</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-07T17:17:43.813300" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.813937" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.813731" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.813714" elapsed="0.000315"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.816116" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:17:43.814161" elapsed="0.002002"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:43.816550" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.816361" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:43.816622" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:17:43.176484" elapsed="0.640289"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:17:43.176267" elapsed="0.640551"/>
</iter>
<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-07T17:17:43.821064" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.820672" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.821545" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.821243" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:43.821613" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.821764" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.820311" elapsed="0.001477"/>
</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-07T17:17:43.821934" elapsed="0.000172"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.822587" 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-07T17:17:43.822260" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.823014" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.822763" elapsed="0.000277"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.823440" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:43.823182" elapsed="0.000283"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.825850" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.825513" elapsed="0.000364"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:43.825921" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.826091" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:43.825182" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.874479" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.874112" elapsed="0.000394"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.875218" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.875001" elapsed="0.000294">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.875386" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.874661" elapsed="0.000749"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.875942" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.875567" elapsed="0.000418"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.876275" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:43.876407" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:43.876141" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.876868" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.876624" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.877853" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.877601" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.878328" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.878066" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.878655" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.878852" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.879034" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.878530" elapsed="0.000563"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.878400" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:43.879164" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.879346" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:43.877286" elapsed="0.002086"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.876997" elapsed="0.002407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.879572" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.879429" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.876960" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.880223" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.879785" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.880296" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:43.873494" elapsed="0.006924"/>
</kw>
<msg time="2026-04-07T17:17:43.880469" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.861745" elapsed="0.018830"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.892392" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.904014" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.915566" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.915957" elapsed="0.000078"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.916357" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.916850" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.916711" elapsed="0.000230"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:43.916696" elapsed="0.000286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.917124" 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-07T17:17:43.917289" 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-07T17:17:43.917450" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:43.916667" elapsed="0.000836"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.916536" elapsed="0.001004"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.917836" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.918003" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.918192" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:43.856321" elapsed="0.061920"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.920556" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.920316" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.920808" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.919887" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.921356" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.921028" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.922006" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.921696" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.921491" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.920949" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.924625" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:43.922444" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:43.924762" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:43.925173" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.919068" elapsed="0.006154"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:43.927472" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:43.927210" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:43.927722" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:43.926787" elapsed="0.000979"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:43.928138" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.927903" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.927863" elapsed="0.000430"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.928586" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.928955" elapsed="0.000106"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.929152" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:43.931143" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:43.925998" elapsed="0.005195"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.934695" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.934371" elapsed="0.000418"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.935508" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.935123" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.948367" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.948908" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:43.949210" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.937815" elapsed="0.011432"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.935736" elapsed="0.013604"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.949697" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.949422" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.935695" elapsed="0.014196"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.955475" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.951948" elapsed="0.003808"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.951643" elapsed="0.004162"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.951614" elapsed="0.004226"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.959226" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.956242" elapsed="0.003048"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.955916" elapsed="0.003421"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.955893" elapsed="0.003513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.960193" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.959621" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.960527" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.960298" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.961071" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.960759" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.960608" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.960280" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.961660" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.961303" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.961995" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.961755" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.962518" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.962227" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.962077" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.961737" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:43.962740" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:43.963538" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.963250" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:43.963710" elapsed="0.002146"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.950840" elapsed="0.015186"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.966352" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.966164" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.966124" elapsed="0.000348"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:43.972487" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:43.966764" elapsed="0.005772"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:43.972630" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:43.972917" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.931987" elapsed="0.040994"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.973208" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:43.973460" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.833999" elapsed="0.139488"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.973818" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.973569" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.973552" elapsed="0.000786"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:43.974372" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:43.830027" elapsed="0.144470"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.826183" elapsed="0.148356"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.826166" elapsed="0.148397"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:43.975242" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:43.975135" elapsed="0.000151"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:43.975434" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:43.975308" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.975117" elapsed="0.000397"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.975654" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:17:43.975772" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:43.974814" elapsed="0.000982"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.976336" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:43.975955" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.976982" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:43.976510" elapsed="0.000500"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.982868" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.982345" elapsed="0.000604"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:43.983773" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.983202" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:43.994651" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:43.994753" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":18,"SnapshotIndex":67,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":67,"Leader":"member-1-shard-default-operational","LastIndex":71,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":68,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":71,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.503","active":true,"matchIndex":68,"voting":true,"id":"member-3-shard-default-operational","nextIndex":69},{"timeSinceLastActivity":"00:00:00.503","active":true,"matchIndex":68,"voting":true,"id":"member-2-shard-default-operational","nextIndex":69}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"427.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":68,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50589},"timestamp":1775582264,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:43.994905" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:43.988542" elapsed="0.006413"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.983935" elapsed="0.011400"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:43.995564" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:43.995365" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.983916" elapsed="0.011910"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.000080" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":18,"SnapshotIndex":67,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":67,"Leader":"member-1-shard-default-operational","LastIndex":71,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":68,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":71,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.503","active":true,"matchIndex":68,"voting":true,"id":"member-3-shard-default-operational","nextIndex":69},{"timeSinceLastActivity":"00:00:00.503","active":true,"matchIndex":68,"voting":true,"id":"member-2-shard-default-operational","nextIndex":69}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"427.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":68,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50589},"timestamp":1775582264,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:43.997666" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:43.997190" elapsed="0.003072"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:43.997148" elapsed="0.003181"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.003149" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.000950" elapsed="0.002295"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.000475" elapsed="0.002838"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.000434" elapsed="0.002971"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.005101" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.003951" elapsed="0.001290"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.006144" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.005436" elapsed="0.000883"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.007710" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.006901" elapsed="0.000872"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.006413" elapsed="0.001456"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.005377" elapsed="0.002583"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.009841" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.008736" elapsed="0.001263"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.010885" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.010197" elapsed="0.001001"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.012444" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.011816" elapsed="0.000674"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.011293" elapsed="0.001265"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.010138" elapsed="0.002484"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.012924" elapsed="0.000641"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.014455" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.013832" elapsed="0.000723"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.014816" elapsed="0.002476"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:43.996298" elapsed="0.021100"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.017637" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.017494" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.017475" elapsed="0.000296"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.021116" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.017912" elapsed="0.003233"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.021274" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:17:44.021434" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:43.977931" elapsed="0.043529"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.021516" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:44.021660" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:43.977220" elapsed="0.044465"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.022735" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.022245" elapsed="0.000518"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:44.022811" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.023112" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:44.021898" elapsed="0.001244"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.023509" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 68, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.023292" elapsed="0.000244"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.023879" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.023684" elapsed="0.000220"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:44.023950" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:17:44.024120" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:43.824580" elapsed="0.199564"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:44.024199" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:44.024341" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:17:43.823869" elapsed="0.200495"/>
</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-07T17:17:44.024648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.024440" elapsed="0.000264"/>
</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="PASS" start="2026-04-07T17:17:44.024928" elapsed="0.000271"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.024727" elapsed="0.000512"/>
</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-07T17:17:44.025406" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.025263" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.024423" elapsed="0.001059"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:43.823708" elapsed="0.201797"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.027894" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.027554" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:44.027980" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.028128" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:44.027191" elapsed="0.000961"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.076290" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.075904" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.077063" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.076836" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.077219" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.076511" elapsed="0.000732"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.077778" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.077402" elapsed="0.000403"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.078109" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:44.078234" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:44.077959" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.078650" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.078411" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.079639" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.079373" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.080113" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.079836" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.080446" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.080643" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.080810" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.080318" elapsed="0.000548"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.080186" elapsed="0.000709"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:44.080936" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:17:44.081107" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:44.079057" elapsed="0.002076"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.078760" elapsed="0.002403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.081329" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.081187" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.078741" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.081958" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.081541" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.082049" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.075277" elapsed="0.006892"/>
</kw>
<msg time="2026-04-07T17:17:44.082220" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.063622" elapsed="0.018703"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.095208" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.106937" elapsed="0.000081"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.118554" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.118983" elapsed="0.000058"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.119370" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.119911" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.119765" elapsed="0.000219"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:44.119748" elapsed="0.000264"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.120152" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.120315" 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-07T17:17:44.120474" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.119714" elapsed="0.000812"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.119573" elapsed="0.000991"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.120864" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.121036" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:17:44.121253" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:44.058245" elapsed="0.063060"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.123755" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.123449" elapsed="0.000376">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.124055" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.122983" elapsed="0.001117"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.124580" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.124238" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.125268" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.124937" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.124715" elapsed="0.000636"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.124197" elapsed="0.001209"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.127912" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.125706" elapsed="0.002251"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:44.128120" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:17:44.128402" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.122145" elapsed="0.006304"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.130754" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.130513" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.131028" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.130100" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:44.131438" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.131219" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.131176" elapsed="0.000451"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.131930" elapsed="0.000175"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.132429" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.132572" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.134563" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.129277" elapsed="0.005335"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.138112" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.137762" elapsed="0.000445"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.138858" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.138531" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.160126" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.160703" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:44.161052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.141214" elapsed="0.019876"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.139102" elapsed="0.022081"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.161544" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.161265" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.139061" elapsed="0.022678"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.167327" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.163812" elapsed="0.003833"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.163492" elapsed="0.004218"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.163463" elapsed="0.004291"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.170413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.168263" elapsed="0.002198"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.167856" elapsed="0.002639"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.167824" elapsed="0.002696"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.171116" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.170680" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.171445" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.171213" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.172013" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.171699" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.171540" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.171194" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.172610" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.172253" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.172928" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.172705" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.173490" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.173199" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.173032" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.172687" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.173714" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.174523" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.174228" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.174698" elapsed="0.002221"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.162713" elapsed="0.014368"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.177407" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.177219" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.177179" elapsed="0.000348"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.183676" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.177818" elapsed="0.005907"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.183820" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:44.184133" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.135355" elapsed="0.048828"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.184399" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.184649" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.035979" elapsed="0.148697"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.185026" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.184761" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.184743" elapsed="0.000788"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.185565" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:44.032080" elapsed="0.153610"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.028217" elapsed="0.157516"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.028200" elapsed="0.157556"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.186403" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.186297" elapsed="0.000151"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:44.186568" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.186470" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.186280" elapsed="0.000369"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.186788" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:17:44.186906" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:44.186032" elapsed="0.000898"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.187471" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.187106" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.188150" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.187663" elapsed="0.000515"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.194337" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.193778" elapsed="0.000640"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.195130" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.194584" elapsed="0.000626"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.207343" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.207446" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":72,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":72,"Leader":"member-1-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"346.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50712},"timestamp":1775582264,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:44.207638" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.200030" elapsed="0.007660"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.195292" elapsed="0.012550"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.208069" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.207871" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.195273" elapsed="0.013040"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.214418" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":72,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":72,"Leader":"member-1-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":74,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"346.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50712},"timestamp":1775582264,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.211087" elapsed="0.003482"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.210359" elapsed="0.004304"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.210301" elapsed="0.004454"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.217998" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.215677" elapsed="0.002417"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.214953" elapsed="0.003208"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.214897" elapsed="0.003330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.219566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.218760" elapsed="0.000906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.220309" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.219806" elapsed="0.000628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.221365" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.220846" elapsed="0.000563"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.220500" elapsed="0.000978"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.219765" elapsed="0.001776"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.222891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.222122" elapsed="0.000891"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.223675" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.223156" elapsed="0.000646"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.224699" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.224232" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.223867" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.223115" elapsed="0.001762"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.225276" elapsed="0.000619"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.226773" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.226179" elapsed="0.000689"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.227140" elapsed="0.002617"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.208939" elapsed="0.020923"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.230117" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.229958" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.229938" elapsed="0.000314"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.233526" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.230394" elapsed="0.003161"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.233653" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:44.233810" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.189297" elapsed="0.044538"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.233924" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.234091" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.188552" elapsed="0.045564"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.235170" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.234664" elapsed="0.000535"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:44.235247" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.235419" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:44.234331" elapsed="0.001114"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.235808" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.235603" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.236198" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.236000" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:44.236269" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.236417" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:44.026536" elapsed="0.209905"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:44.236497" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:44.236641" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:44.025819" elapsed="0.210845"/>
</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="PASS" start="2026-04-07T17:17:44.236951" elapsed="0.000290"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.236742" elapsed="0.000537"/>
</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-07T17:17:44.237444" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.237304" 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-07T17:17:44.237654" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.237521" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.236725" elapsed="0.001002"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:44.025659" elapsed="0.212091"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.240123" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.239767" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:44.240193" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.240337" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:44.239410" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.288888" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.288516" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.289632" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.289421" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.289825" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.289091" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.290410" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.290025" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.290726" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:44.290946" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:44.290591" elapsed="0.000400"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.291455" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.291207" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.292460" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.292210" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.292922" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.292658" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.293277" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.293475" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.293642" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.293149" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.293012" elapsed="0.000716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:44.293770" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.293925" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:44.291870" elapsed="0.002079"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.291567" elapsed="0.002428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.294164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.294021" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.291547" elapsed="0.002692"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.294801" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.294377" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.294875" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.287893" elapsed="0.007120"/>
</kw>
<msg time="2026-04-07T17:17:44.295070" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.276193" elapsed="0.018986"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.307134" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.318814" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.330514" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.330906" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.331309" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.331825" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.331682" elapsed="0.000201"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:44.331666" 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-07T17:17:44.332059" 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-07T17:17:44.332223" 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-07T17:17:44.332381" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.331623" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.331490" elapsed="0.000979"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.332765" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.332917" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.333127" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:44.270730" elapsed="0.062447"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.335463" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.335221" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.335739" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.334795" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.336291" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.335923" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.336932" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.336632" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.336427" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.335882" elapsed="0.001208"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.339576" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.337388" elapsed="0.002232"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:44.339728" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:44.340072" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.334005" elapsed="0.006117"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.342361" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.342121" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.342650" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.341698" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:44.343069" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.342832" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.342792" elapsed="0.000435"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.343524" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.343925" elapsed="0.000168"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.344187" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.346184" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.340888" elapsed="0.005346"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.349711" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.349386" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.350503" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.350180" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.369301" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.369845" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:44.370148" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.352840" elapsed="0.017345"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.350731" elapsed="0.019549"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.370640" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.370363" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.350690" elapsed="0.020144"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.376435" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.372911" elapsed="0.003801"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.372607" elapsed="0.004155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.372577" elapsed="0.004220"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.380233" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.377200" elapsed="0.003088"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.376874" elapsed="0.003452"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.376850" elapsed="0.003501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.380898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.380503" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.381240" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.381009" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.381776" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.381478" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.381323" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.380989" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.382391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.382029" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.382709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.382485" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.383276" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.382961" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.382807" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.382467" elapsed="0.000891"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.383500" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.384315" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.384028" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.384487" elapsed="0.002286"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.371827" elapsed="0.015094"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.387285" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.387096" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.387054" elapsed="0.000350"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.393431" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.387719" elapsed="0.005761"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.393576" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:44.393861" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.346978" elapsed="0.046933"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.394145" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.394397" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.248322" elapsed="0.146102"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.394754" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.394506" elapsed="0.000712"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.394489" elapsed="0.000759"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.395282" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:44.244344" elapsed="0.151062"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.240428" elapsed="0.155020"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.240411" elapsed="0.155060"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.396182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.396073" elapsed="0.000153"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:17:44.396348" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.396249" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.396055" elapsed="0.000372"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.396567" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:17:44.396685" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:44.395748" elapsed="0.000963"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.397251" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.396870" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.397876" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.397425" elapsed="0.000478"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.403830" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.403252" elapsed="0.000660"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.404689" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.404162" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.416401" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.416544" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-1-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"371.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50712},"timestamp":1775582264,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:44.416751" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.409499" elapsed="0.007321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.404849" elapsed="0.012204"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.417338" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.417094" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.404830" elapsed="0.012828"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.423640" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":73,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":73,"Leader":"member-1-shard-default-operational","LastIndex":74,"RaftState":"Follower","LastApplied":74,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":74,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"371.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":74,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":50712},"timestamp":1775582264,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.420325" elapsed="0.003498"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.419521" elapsed="0.004398"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.419464" elapsed="0.004571"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.428100" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.424898" elapsed="0.003335"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.424235" elapsed="0.004092"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.424180" elapsed="0.004242"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.430419" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.429251" elapsed="0.001313"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.431541" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.430768" elapsed="0.000950"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.432898" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.432408" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.431870" elapsed="0.001204"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.430707" elapsed="0.002431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.434456" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.433672" elapsed="0.000882"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.435197" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.434692" elapsed="0.000718"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.436329" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.435838" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.435476" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.434650" elapsed="0.001856"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.436808" elapsed="0.000704"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.438382" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.437777" elapsed="0.000702"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.438735" elapsed="0.002487"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.418296" elapsed="0.023033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.441567" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.441424" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.441405" elapsed="0.000297"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.444840" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.441844" elapsed="0.003024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.445117" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:17:44.445279" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.398836" elapsed="0.046469"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.445392" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.445541" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.398122" elapsed="0.047445"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.446612" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.446132" elapsed="0.000509"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:44.446688" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.446859" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558226...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:44.445780" elapsed="0.001105"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.447245" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 74, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.447047" elapsed="0.000224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.447615" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.447420" elapsed="0.000220"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:44.447685" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.447856" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:44.238800" elapsed="0.209080"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:44.447936" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:44.448100" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:44.238094" elapsed="0.210030"/>
</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="PASS" start="2026-04-07T17:17:44.448409" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.448201" elapsed="0.000434"/>
</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-07T17:17:44.448797" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.448659" 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-07T17:17:44.449099" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.448874" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.448184" elapsed="0.000990"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:44.237909" elapsed="0.211288"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:43.823511" elapsed="0.625716"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:44.449267" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:44.449466" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:17:44.449513" level="INFO">${follower_list} = [2, 3]</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-07T17:17:43.819579" elapsed="0.629957"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.449987" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:17:44.450065" level="INFO">${leader_count} = 1</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-07T17:17:44.449705" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.450363" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.450156" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.450138" elapsed="0.000301"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.452446" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:17:44.450568" elapsed="0.001924"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:44.452874" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.452686" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:44.452946" elapsed="0.000098"/>
</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="PASS" start="2026-04-07T17:17:43.817134" elapsed="0.636040"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:17:43.816901" elapsed="0.636320"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:17:43.176129" elapsed="1.277124"/>
</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="PASS" start="2026-04-07T17:17:43.175718" elapsed="1.277590"/>
</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-07T17:17:44.458237" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.457840" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.458716" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:44.458417" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:44.458785" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.458936" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.457478" elapsed="0.001482"/>
</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-07T17:17:44.459142" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.459867" 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-07T17:17:44.459522" elapsed="0.000371"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.460302" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:44.460060" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.460713" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:44.460474" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.463145" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.462795" elapsed="0.000377"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:44.463216" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:17:44.463365" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:44.462463" elapsed="0.000927"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.512702" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.512332" elapsed="0.000398"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.513486" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.513237" elapsed="0.000312">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.513642" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.512895" elapsed="0.000771"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.514220" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.513824" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.514541" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:44.514824" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:44.514401" elapsed="0.000450"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.515272" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.515026" 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-07T17:17:44.516270" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.516013" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.516726" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.516467" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.517072" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.517272" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.517439" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.516930" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.516799" elapsed="0.000725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:44.517564" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.517720" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:44.515667" elapsed="0.002077"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.515384" elapsed="0.002391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.517941" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.517800" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.515365" elapsed="0.002667"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.518586" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.518169" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.518661" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.511687" elapsed="0.007093"/>
</kw>
<msg time="2026-04-07T17:17:44.518833" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.499940" elapsed="0.018997"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.530677" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.542284" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.553862" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.554309" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.554688" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.555207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.555066" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:44.555052" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.555421" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.555584" 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-07T17:17:44.555744" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.555021" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.554871" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.556157" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.556310" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.556500" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:44.494498" elapsed="0.062051"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.558843" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.558603" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.559121" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.558191" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.559668" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.559302" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.560353" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.560057" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.559807" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.559262" elapsed="0.001230"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.563031" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.560788" elapsed="0.002292"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:44.563178" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:44.563457" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.557381" elapsed="0.006124"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.565842" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.565603" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.566115" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.565194" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:44.566516" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.566298" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.566257" elapsed="0.000417"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.567096" elapsed="0.000057"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.567509" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.567653" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.570582" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.564301" elapsed="0.006331"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.574192" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.573849" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.574925" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.574604" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.584648" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.585229" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:44.585517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.577184" elapsed="0.008370"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.575169" elapsed="0.010478"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.586039" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.585730" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.575128" elapsed="0.011114"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.591995" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.588287" elapsed="0.004039"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.587956" elapsed="0.004406"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.587924" elapsed="0.004463"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.594757" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.592660" elapsed="0.002142"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.592442" elapsed="0.002394"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.592425" elapsed="0.002435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.595445" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.595071" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.595770" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.595541" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.596336" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.596033" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.595851" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.595523" elapsed="0.000896"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.596935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.596572" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.597279" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.597047" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.597801" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.597511" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.597360" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.597029" elapsed="0.000854"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.598041" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.598821" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.598542" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.599008" elapsed="0.002125"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.587189" elapsed="0.014093"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.601605" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.601419" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.601377" elapsed="0.000350"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.607605" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.602039" elapsed="0.005614"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.607750" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:44.608079" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.571517" elapsed="0.036614"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.608353" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.608607" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.472159" elapsed="0.136475"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.608978" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.608716" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.608699" elapsed="0.000774"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.609507" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:44.468062" elapsed="0.141569"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.463457" elapsed="0.146216"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.463439" elapsed="0.146258"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:44.610339" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.610234" elapsed="0.000164"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.610457" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.610421" elapsed="0.000074"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.610217" elapsed="0.000300"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.610655" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:17:44.610773" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:44.609948" elapsed="0.000850"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.611349" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.610957" elapsed="0.000418"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.612010" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.611525" elapsed="0.000513"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.618144" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.617592" elapsed="0.000636"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.618920" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.618396" elapsed="0.000693"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.631166" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.631269" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":9,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":45,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.104","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-topology-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.104","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-topology-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"583.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":14,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582264,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:44.631429" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.623830" elapsed="0.007649"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.619174" elapsed="0.012458"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.631839" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.631661" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.619154" elapsed="0.012976"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.637603" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":9,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":45,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.104","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-topology-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.104","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-topology-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"583.7 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":14,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582264,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.634453" elapsed="0.003313"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.633670" elapsed="0.004195"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.633612" elapsed="0.004561"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.641594" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.639062" elapsed="0.002626"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.638384" elapsed="0.003370"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.638328" elapsed="0.003493"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.643239" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.642450" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.643984" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.643474" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.645011" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.644525" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.644178" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.643432" elapsed="0.001762"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.646534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.645728" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.647271" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.646769" elapsed="0.000625"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.648313" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.647806" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.647461" elapsed="0.000965"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.646728" elapsed="0.001764"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.648793" elapsed="0.000646"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.650367" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.649708" elapsed="0.000756"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.650721" elapsed="0.002404"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.632607" elapsed="0.020625"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.653476" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.653332" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.653312" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.657051" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.653755" elapsed="0.003325"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.657181" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:44.657369" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.613158" elapsed="0.044238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.657453" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.657600" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.612243" elapsed="0.045383"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.658705" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582264, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.658213" elapsed="0.000520"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:44.658781" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.658956" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582264, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:44.657838" elapsed="0.001235"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.659427" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.659225" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.659798" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.659602" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:44.659868" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.660047" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:44.461857" elapsed="0.198215"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:44.660128" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:44.660269" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:17:44.461159" elapsed="0.199134"/>
</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-07T17:17:44.660577" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.660369" 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="PASS" start="2026-04-07T17:17:44.661058" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.660830" elapsed="0.000459"/>
</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-07T17:17:44.661457" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.661314" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.660352" elapsed="0.001181"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:44.460995" elapsed="0.200561"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.663986" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.663606" elapsed="0.000409"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:44.664062" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.664211" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:44.663271" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.712669" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.712298" elapsed="0.000399"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.713451" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.713238" elapsed="0.000276">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.713605" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.712853" elapsed="0.000777"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.714186" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.713789" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.714501" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:44.714626" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:44.714367" elapsed="0.000284"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.715060" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.714802" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.716050" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.715768" elapsed="0.000327"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.716511" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.716250" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.716843" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.717058" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.717230" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.716716" elapsed="0.000571"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.716584" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:44.717359" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.717513" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:44.715452" elapsed="0.002086"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.715171" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.717735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.717594" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.715152" elapsed="0.002658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.718382" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.717946" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.718456" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.711655" elapsed="0.006921"/>
</kw>
<msg time="2026-04-07T17:17:44.718627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.699802" elapsed="0.018932"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.730553" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.742178" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.754019" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.754417" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.754795" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.755321" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.755181" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:44.755167" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.755534" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.755696" 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-07T17:17:44.755856" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.755136" elapsed="0.000772"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.754996" elapsed="0.000949"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.756283" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.756438" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.756629" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:44.694363" elapsed="0.062315"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.759002" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.758739" elapsed="0.000327">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.759259" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.758326" elapsed="0.000977"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.759764" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.759440" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.760446" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.760143" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.759898" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.759399" elapsed="0.001185"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.763114" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.760882" elapsed="0.002278"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:44.763255" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:44.763535" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.757512" elapsed="0.006071"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.765886" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.765644" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.766157" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.765230" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:44.766558" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.766338" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.766298" elapsed="0.000418"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.767157" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.767532" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.767674" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.769560" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.764373" elapsed="0.005237"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.773065" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.772723" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.773801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.773480" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.811187" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.811732" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:44.812087" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.776380" elapsed="0.035746"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.774045" elapsed="0.038180"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.812585" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.812308" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.774002" elapsed="0.038779"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.818485" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.814964" elapsed="0.003803"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.814660" elapsed="0.004156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.814631" elapsed="0.004219"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.821939" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.819274" elapsed="0.002757"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.818928" elapsed="0.003139"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.818904" elapsed="0.003187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.822614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.822245" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.822937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.822709" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.823486" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.823190" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.823035" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.822691" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.824103" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.823718" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.824430" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.824199" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.824951" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.824662" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.824510" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.824180" elapsed="0.000964"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.825293" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.826093" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.825795" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.826267" elapsed="0.002126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.813815" elapsed="0.014726"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.828869" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.828680" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.828639" elapsed="0.000375"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.835014" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.829310" elapsed="0.005753"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.835158" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:17:44.835444" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.770376" elapsed="0.065118"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.835713" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:44.835980" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.672044" elapsed="0.163964"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.836363" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.836112" elapsed="0.000686"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.836094" elapsed="0.000734"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.836862" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:44.668049" elapsed="0.168953"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.664303" elapsed="0.172742"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.664285" elapsed="0.172784"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:44.837692" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.837587" elapsed="0.000163"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.837810" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.837773" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.837570" elapsed="0.000300"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.838041" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:17:44.838162" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:44.837324" elapsed="0.000862"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.838711" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.838347" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.839362" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.838887" elapsed="0.000502"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.845391" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.844839" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.846265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.845641" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:44.858549" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:44.858648" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"263.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582264,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:44.858796" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:44.851017" elapsed="0.007828"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.846430" elapsed="0.012581"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.859225" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.859042" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.846410" elapsed="0.013043"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.864617" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"263.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582264,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.861379" elapsed="0.003436"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.860797" elapsed="0.004113"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.860756" elapsed="0.004274"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.869012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.865891" elapsed="0.003267"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.865231" elapsed="0.004015"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.865174" elapsed="0.004146"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.870720" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.869854" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.871462" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.870954" elapsed="0.000631"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.872503" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.872015" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.871652" elapsed="0.000964"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.870912" elapsed="0.001769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.874055" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.873229" elapsed="0.000923"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.874773" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.874290" elapsed="0.000606"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.875827" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.875363" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.874977" elapsed="0.000963"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.874248" elapsed="0.001772"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.876353" elapsed="0.000637"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:44.877854" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.877263" elapsed="0.000688"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.878283" elapsed="0.002447"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:44.859891" elapsed="0.020945"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.881091" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:44.880932" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.880913" elapsed="0.000318"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:44.884672" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:44.881372" elapsed="0.003329"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:44.884799" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:44.884955" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.840337" elapsed="0.044660"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.885054" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.885200" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.839594" elapsed="0.045631"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.886257" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582264, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.885765" elapsed="0.000520"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:44.886368" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:44.886544" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582264, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:44.885438" elapsed="0.001132"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.886916" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.886719" elapsed="0.000224"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:44.887310" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.887111" elapsed="0.000224"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:44.887381" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.887528" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:44.662661" elapsed="0.224891"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:44.887607" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:44.887749" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:44.661869" elapsed="0.225904"/>
</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="PASS" start="2026-04-07T17:17:44.888319" elapsed="0.000272"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.887849" elapsed="0.000782"/>
</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-07T17:17:44.888796" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.888656" 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-07T17:17:44.889025" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.888874" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.887832" elapsed="0.001268"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:44.661708" elapsed="0.227415"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.891627" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.891280" elapsed="0.000374"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:44.891698" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.891842" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:44.890929" elapsed="0.000937"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.940128" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.939733" elapsed="0.000450"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.940876" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.940667" elapsed="0.000272">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.941048" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.940342" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.941612" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.941234" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.941924" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:44.942064" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:44.941791" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.942518" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.942275" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.943630" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.943376" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.944103" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:44.943827" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.944453" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.944649" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.944815" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.944325" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.944191" elapsed="0.000710"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:44.944943" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:17:44.945117" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:44.942909" elapsed="0.002233"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.942629" elapsed="0.002544"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.945338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.945197" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.942610" elapsed="0.002804"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.945985" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:44.945551" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:44.946061" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:44.939131" elapsed="0.007051"/>
</kw>
<msg time="2026-04-07T17:17:44.946234" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:44.927232" elapsed="0.019107"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.957888" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.969463" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.981134" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.981527" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.981902" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.982508" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.982366" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:44.982351" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.982721" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.982883" 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-07T17:17:44.983070" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:44.982321" elapsed="0.000805"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.982186" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.983462" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.983613" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:44.983799" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:44.921825" elapsed="0.062023"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.986162" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.985907" elapsed="0.000318">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.986415" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.985495" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.986921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:44.986595" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.987624" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:44.987327" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.987119" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.986555" elapsed="0.001207"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:44.990409" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:44.988074" elapsed="0.002380"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:44.990546" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:44.990823" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.984686" elapsed="0.006186"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:44.993173" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:44.992918" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:44.993425" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:44.992510" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:44.993825" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:44.993606" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.993565" elapsed="0.000434"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.994298" elapsed="0.000053"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:44.994667" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:44.994809" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:44.996799" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:44.991688" elapsed="0.005160"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.000317" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:44.999961" elapsed="0.000452"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.001069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.000730" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.021609" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.022234" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:45.022539" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.003387" elapsed="0.019188"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.001301" elapsed="0.021368"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.023056" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.022751" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.001260" elapsed="0.021999"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.029070" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.025404" elapsed="0.003944"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.025088" elapsed="0.004309"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.024946" elapsed="0.004486"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.032835" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.029811" elapsed="0.003086"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.029509" elapsed="0.003435"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.029485" elapsed="0.003513"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.033637" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.033235" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.033960" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.033733" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.034504" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.034209" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.034056" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.033714" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.035113" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.034735" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.035431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.035207" elapsed="0.000279"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.036041" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.035660" elapsed="0.000407"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.035510" elapsed="0.000592"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.035189" elapsed="0.000934"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.036283" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.037069" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.036782" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.037243" elapsed="0.002342"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.024201" elapsed="0.015536"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.040084" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.039876" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.039834" elapsed="0.000372"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.046200" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.040527" elapsed="0.005722"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.046345" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:45.046632" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:44.997582" elapsed="0.049101"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.046904" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.047172" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:44.899562" elapsed="0.147637"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.047528" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.047282" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.047264" elapsed="0.000781"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.048080" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:44.895635" elapsed="0.152574"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:44.891932" elapsed="0.156343"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:44.891915" elapsed="0.156384"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:45.048919" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.048815" elapsed="0.000179"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.049056" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.049019" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.048798" elapsed="0.000319"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.049256" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:17:45.049374" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:45.048553" elapsed="0.000845"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.049917" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.049556" elapsed="0.000386"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.050564" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.050109" elapsed="0.000481"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.056598" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.055954" elapsed="0.000726"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.057392" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.056845" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.084891" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.085069" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:45 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"215.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582265,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:45.085314" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.062164" elapsed="0.023231"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.057555" elapsed="0.028061"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.085916" elapsed="0.000098"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.085659" elapsed="0.000619"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.057536" elapsed="0.028786"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.092123" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-topology-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"215.4 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":1838},"timestamp":1775582265,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.088883" elapsed="0.003500"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.088204" elapsed="0.004276"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.088146" elapsed="0.004431"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.096605" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.093460" elapsed="0.003277"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.092775" elapsed="0.004057"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.092719" elapsed="0.004207"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.099039" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.097814" elapsed="0.001387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.100148" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.099432" elapsed="0.000934"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.101582" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.100955" elapsed="0.000671"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.100461" elapsed="0.001235"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.099368" elapsed="0.002393"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.103105" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.102315" elapsed="0.000889"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.103833" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.103343" elapsed="0.000613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.104911" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.104447" elapsed="0.000508"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.104086" elapsed="0.000954"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.103302" elapsed="0.001814"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.105433" elapsed="0.000650"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.107003" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.106359" elapsed="0.000746"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.107367" elapsed="0.002530"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.086960" elapsed="0.023064"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.110338" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.110124" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.110104" elapsed="0.000381"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.113794" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.110626" elapsed="0.003196"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.113922" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:45.114103" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.051525" elapsed="0.062605"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.114191" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.114341" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.050793" elapsed="0.063573"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.115444" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.114938" elapsed="0.000534"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:45.115556" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.115730" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:45.114594" elapsed="0.001162"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.116231" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.115905" elapsed="0.000353"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.116636" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.116435" elapsed="0.000227"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:45.116708" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.116858" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:44.890338" elapsed="0.226544"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:45.116940" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:45.117105" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:44.889445" elapsed="0.227685"/>
</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="PASS" start="2026-04-07T17:17:45.117424" elapsed="0.000194"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.117211" elapsed="0.000444"/>
</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-07T17:17:45.117818" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.117680" 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-07T17:17:45.118046" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.117895" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.117194" elapsed="0.000926"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:44.889284" elapsed="0.228860"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:44.460783" elapsed="0.657396"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.118223" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:45.118426" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:17:45.118472" level="INFO">${follower_list} = [2, 3]</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-07T17:17:44.456756" elapsed="0.661739"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.120478" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:17:45.120562" level="INFO">${leader_count} = 1</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-07T17:17:45.118668" elapsed="0.001919"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.120869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.120657" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.120639" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.122833" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:17:45.121094" elapsed="0.001784"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:45.123240" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.123052" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.123312" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:17:44.454284" elapsed="0.669181"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:17:44.454067" elapsed="0.669445"/>
</iter>
<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-07T17:17:45.127811" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.127430" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.128369" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:45.128048" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:45.128441" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.128592" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:45.127064" 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-07T17:17:45.128765" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.129418" 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-07T17:17:45.129088" elapsed="0.000356"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.129833" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:45.129596" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.130251" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:45.130017" elapsed="0.000260"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.132718" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.132375" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:45.132789" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.132934" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:45.132016" elapsed="0.000942"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.181450" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.181077" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.182230" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.181979" elapsed="0.000328">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.182453" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.181636" elapsed="0.000841"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.183040" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.182637" elapsed="0.000430"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.183362" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:45.183576" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:45.183225" elapsed="0.000377"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.184012" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.183754" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.185012" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.184742" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.185475" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.185211" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.185805" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.186020" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.186190" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.185677" elapsed="0.000605"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.185546" elapsed="0.000767"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:45.186355" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.186512" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:45.184427" elapsed="0.002110"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.184124" elapsed="0.002445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.186736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.186593" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.184105" elapsed="0.002707"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.187387" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.186947" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.187461" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:45.180461" elapsed="0.007121"/>
</kw>
<msg time="2026-04-07T17:17:45.187636" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.168746" elapsed="0.018996"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.199600" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.211280" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.223058" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.223453" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.223831" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.224347" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.224206" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:45.224191" elapsed="0.000246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.224571" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.224735" 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-07T17:17:45.224896" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.224161" elapsed="0.000787"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.224027" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.225299" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.225519" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:45.225709" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:45.163302" elapsed="0.062457"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.228077" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.227815" elapsed="0.000325">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.228337" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.227404" elapsed="0.001003"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.228879" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.228552" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.229543" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.229243" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.229034" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.228511" elapsed="0.001171"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.232216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.229997" elapsed="0.002264"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:45.232355" elapsed="0.000072"/>
</return>
<msg time="2026-04-07T17:17:45.232646" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.226593" elapsed="0.006102"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.234934" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.234695" elapsed="0.000319">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.235208" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.234287" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:45.235612" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.235392" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.235351" elapsed="0.000418"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.236192" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.236589" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.236735" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.238732" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.233481" elapsed="0.005300"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.242263" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.241919" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.243027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.242688" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.255156" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.255732" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:45.256077" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.245373" elapsed="0.010742"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.243261" elapsed="0.012949"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.256593" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.256294" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.243219" elapsed="0.013570"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.262546" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.258835" elapsed="0.003992"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.258531" elapsed="0.004345"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.258503" elapsed="0.004408"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.266314" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.263316" elapsed="0.003061"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.263011" elapsed="0.003413"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.262985" elapsed="0.003474"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.267212" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.266673" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.267666" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.267348" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.268460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.268011" elapsed="0.000487"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.267778" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.267323" elapsed="0.001255"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.269333" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.268790" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.269670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.269443" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.270217" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.269903" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.269751" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.269425" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.270442" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.271230" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.270941" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.271404" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.257758" elapsed="0.015906"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.274012" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.273803" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.273762" elapsed="0.000374"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.280128" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.274429" elapsed="0.005748"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.280274" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:45.280575" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.239526" elapsed="0.041100"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.280844" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.281113" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.140840" elapsed="0.140300"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.281475" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.281224" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.281206" elapsed="0.000729"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.281984" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:45.136885" elapsed="0.145227"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.133052" elapsed="0.149103"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.133033" elapsed="0.149146"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:45.282805" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.282698" elapsed="0.000166"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.282924" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.282887" elapsed="0.000109"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.282680" elapsed="0.000341"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.283162" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:17:45.283286" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:45.282433" elapsed="0.000878"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.283881" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.283471" elapsed="0.000436"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.284726" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.284073" elapsed="0.000681"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.290626" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.290097" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.291570" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.290870" elapsed="0.000781"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.303827" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.303990" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:45 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.256","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.255","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"540.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:45.304217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.296301" elapsed="0.007985"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.291735" elapsed="0.012783"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.304805" elapsed="0.000064"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.304559" elapsed="0.000606"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.291715" elapsed="0.013489"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.311091" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.256","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.255","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"540.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.307771" elapsed="0.003472"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.307111" elapsed="0.004227"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.307050" elapsed="0.004382"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.315406" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.312313" elapsed="0.003226"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.311630" elapsed="0.004002"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.311573" elapsed="0.004152"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.317695" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.316558" elapsed="0.001233"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.318433" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.317930" elapsed="0.000627"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.319458" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.318983" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.318625" elapsed="0.000946"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.317888" elapsed="0.001747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.321089" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.320182" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.321828" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.321337" elapsed="0.000616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.322889" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.322420" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.322070" elapsed="0.000983"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.321295" elapsed="0.001823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.323421" elapsed="0.000643"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.324962" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.324334" elapsed="0.000748"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.325344" elapsed="0.002540"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.305867" elapsed="0.022141"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.328254" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.328110" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.328090" elapsed="0.000299"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.331777" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.328542" elapsed="0.003264"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.331906" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:45.332112" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.285702" elapsed="0.046437"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.332197" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:17:45.332348" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.284978" elapsed="0.047395"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.333458" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.332947" elapsed="0.000539"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:45.333534" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.333710" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:45.332616" elapsed="0.001121"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.334109" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.333885" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.334479" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.334284" elapsed="0.000220"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:45.334549" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:45.334693" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:45.131399" elapsed="0.203318"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:45.334771" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:45.334911" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:17:45.130690" elapsed="0.204245"/>
</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-07T17:17:45.335282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.335071" elapsed="0.000267"/>
</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="PASS" start="2026-04-07T17:17:45.335560" elapsed="0.000185"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.335361" elapsed="0.000421"/>
</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-07T17:17:45.335946" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.335806" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.335053" elapsed="0.000983"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:45.130528" elapsed="0.205531"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.338368" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.338027" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:45.338439" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.338583" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:45.337681" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.387192" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.386806" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.387949" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.387739" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.388121" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.387375" elapsed="0.000770"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.388698" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.388302" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.389066" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:45.389247" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:45.388917" elapsed="0.000356"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.389665" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.389423" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.390645" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.390394" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.391116" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.390840" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.391445" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.391642" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.391806" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.391318" elapsed="0.000543"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.391188" elapsed="0.000702"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:45.391931" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.392107" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:45.390074" elapsed="0.002057"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.389775" elapsed="0.002388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.392327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.392187" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.389756" elapsed="0.002645"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.393002" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.392565" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.393078" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:45.386204" elapsed="0.006994"/>
</kw>
<msg time="2026-04-07T17:17:45.393249" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.374452" elapsed="0.018901"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.405110" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.416766" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.428504" elapsed="0.000075"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.428918" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.429323" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.429824" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.429685" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:45.429670" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.430055" 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-07T17:17:45.430222" 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-07T17:17:45.430379" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.429640" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.429504" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.430767" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.430920" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.431126" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:45.369024" elapsed="0.062151"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.433500" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.433261" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.433750" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.432828" elapsed="0.000966"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.434293" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.433932" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.434929" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.434632" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.434429" elapsed="0.000601"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.433891" elapsed="0.001193"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.437558" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.435382" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:45.437697" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:45.438039" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.432006" elapsed="0.006084"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.440364" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.440125" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.440643" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.439701" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:45.441066" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.440832" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.440786" elapsed="0.000437"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.441520" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.441891" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.442157" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.444139" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.438854" elapsed="0.005335"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.447635" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.447311" elapsed="0.000419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.448386" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.448065" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.467147" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.468045" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:45.468503" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.450712" elapsed="0.018099"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.448639" elapsed="0.020481"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.469801" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.469285" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.448598" elapsed="0.021557"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.476961" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.473465" elapsed="0.003818"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.473061" elapsed="0.004272"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.473014" elapsed="0.004353"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.480762" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.477747" elapsed="0.003078"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.477444" elapsed="0.003428"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.477420" elapsed="0.003486"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.481598" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.481138" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.481920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.481694" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.482466" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.482170" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.482017" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.481676" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.483084" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.482698" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.483409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.483180" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.483933" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.483643" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.483490" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.483161" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.484173" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.484955" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.484682" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.485145" elapsed="0.002142"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.471753" elapsed="0.015680"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.487755" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.487569" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.487529" elapsed="0.000344"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.493928" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.488187" elapsed="0.005804"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.494089" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:45.494451" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.444928" elapsed="0.049573"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.494717" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.494983" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.346579" elapsed="0.148433"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.495344" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.495096" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.495079" elapsed="0.000720"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.495833" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:45.342649" elapsed="0.153309"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.338673" elapsed="0.157344"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.338656" elapsed="0.157385"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:45.496689" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.496556" elapsed="0.000191"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.496807" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.496770" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.496539" elapsed="0.000327"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.497031" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:17:45.497151" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:45.496293" elapsed="0.000882"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.497699" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.497335" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.498347" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.497873" elapsed="0.000500"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.504143" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.503602" elapsed="0.000622"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.504946" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.504389" elapsed="0.000717"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.517717" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.517819" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:45 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"390.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:45.517983" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.509729" elapsed="0.008306"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.505189" elapsed="0.012996"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.518394" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.518214" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.505170" elapsed="0.013453"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.523699" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"390.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.520456" elapsed="0.003441"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.519925" elapsed="0.004101"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.519885" elapsed="0.004239"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.528164" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.525023" elapsed="0.003274"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.524321" elapsed="0.004071"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.524265" elapsed="0.004221"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.530143" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.529323" elapsed="0.000919"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.530873" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.530381" elapsed="0.000635"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.532092" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.531439" elapsed="0.000700"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.531085" elapsed="0.001125"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.530339" elapsed="0.001935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.533623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.532827" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.534371" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.533861" elapsed="0.000636"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.535400" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.534912" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.534565" elapsed="0.000949"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.533819" elapsed="0.001761"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.535881" elapsed="0.000652"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.537454" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.536831" elapsed="0.000724"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.537814" elapsed="0.002528"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.519073" elapsed="0.021378"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.540709" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.540547" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.540528" elapsed="0.000318"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.544193" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.541001" elapsed="0.003223"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.544324" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:45.544481" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.499312" elapsed="0.045195"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.544563" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:17:45.544734" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.498580" elapsed="0.046179"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.545804" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.545319" elapsed="0.000514"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:45.545915" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.546117" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:45.544985" elapsed="0.001160"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.546490" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.546294" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.546861" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.546664" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:45.546930" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.547094" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:45.337094" elapsed="0.210024"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:45.547173" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:45.547338" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:45.336371" elapsed="0.211000"/>
</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="PASS" start="2026-04-07T17:17:45.547709" elapsed="0.000212"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.547464" elapsed="0.000521"/>
</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-07T17:17:45.548185" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.548016" 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-07T17:17:45.548436" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.548274" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.547444" elapsed="0.001078"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:45.336211" elapsed="0.212338"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.551435" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.551045" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:45.551518" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:17:45.551705" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:45.550625" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.601793" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.601424" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.602553" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.602318" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.602710" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.601993" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.603288" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.602891" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.603602" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:17:45.603741" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:17:45.603468" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.604225" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.603954" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.605222" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.604954" elapsed="0.000311"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.605682" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.605420" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.606034" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.606250" elapsed="0.000030"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.606427" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.605891" elapsed="0.000592"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.605757" elapsed="0.000755"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:17:45.606554" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.606708" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:17:45.604625" elapsed="0.002108"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.604337" elapsed="0.002427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.606928" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.606788" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.604318" elapsed="0.002701"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.607579" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.607158" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.607653" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:17:45.600800" elapsed="0.006972"/>
</kw>
<msg time="2026-04-07T17:17:45.607825" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.588874" elapsed="0.019056"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.621050" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.632789" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.644503" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.644912" elapsed="0.000073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.645327" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.645862" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.645722" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:45.645706" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.646093" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.646257" 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-07T17:17:45.646417" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:17:45.645677" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.645543" elapsed="0.000964"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.646805" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.646959" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:17:45.647168" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:17:45.583401" elapsed="0.063817"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.649594" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.649353" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.649849" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.648897" elapsed="0.000998"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.650404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.650072" elapsed="0.000410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.651222" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.650904" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.650539" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.650030" elapsed="0.001332"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.653908" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.651664" elapsed="0.002290"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:17:45.654112" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:17:45.654396" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.648053" elapsed="0.006393"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:17:45.656917" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:17:45.656604" elapsed="0.000410">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:17:45.657245" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:17:45.656194" elapsed="0.001103"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:17:45.657708" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.657460" elapsed="0.000364"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.657407" elapsed="0.000480"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.658372" elapsed="0.000059"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.658806" elapsed="0.000057"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.658964" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:17:45.703842" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:17:45.655240" elapsed="0.048667"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.707804" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.707422" elapsed="0.000484"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.708582" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.708253" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.729303" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.729723" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:17:45.729956" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.710882" elapsed="0.019122"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.708855" elapsed="0.021219"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.730344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.730136" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.708808" elapsed="0.021677"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.734451" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.731938" elapsed="0.002712"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.731719" elapsed="0.002968"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.731699" elapsed="0.003013"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.737129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.735001" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.734767" elapsed="0.002441"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.734751" elapsed="0.002481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.737783" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.737397" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.738129" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.737879" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.738666" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.738367" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.738211" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.737861" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.739285" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.738901" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.739607" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.739381" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.740168" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.739840" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.739687" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.739363" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.740395" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.741229" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.740923" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.741404" elapsed="0.002279"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.731178" elapsed="0.012657"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.744191" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.743994" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.743933" elapsed="0.000386"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.750251" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.744615" elapsed="0.005685"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.750397" elapsed="0.000070"/>
</return>
<msg time="2026-04-07T17:17:45.750694" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.704907" elapsed="0.045837"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.750982" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.751261" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.560673" elapsed="0.190621"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.751652" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.751396" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.751376" elapsed="0.000778"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.752188" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:17:45.556561" elapsed="0.195753"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.551812" elapsed="0.200545"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.551792" elapsed="0.200590"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:17:45.753063" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.752918" elapsed="0.000204"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.753182" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.753145" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.752900" elapsed="0.000342"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.753385" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:17:45.753504" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:17:45.752639" elapsed="0.000890"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.754076" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.753689" elapsed="0.000414"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.754757" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.754279" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.760779" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.760239" elapsed="0.000635"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.761665" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.761126" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:45.773981" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:45.774085" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:17:45 GMT', 'Expires': 'Tue, 07 Apr 2026 16:17:45 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"410.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200} 
 </msg>
<msg time="2026-04-07T17:17:45.774233" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:45.766471" elapsed="0.007812"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.761827" elapsed="0.012606"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.774636" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.774461" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.761808" elapsed="0.013058"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.779125" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"410.5 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582265,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.776671" elapsed="0.002596"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.776200" elapsed="0.003135"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.776158" elapsed="0.003244"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.782243" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.780043" elapsed="0.002294"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.779544" elapsed="0.002859"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.779504" elapsed="0.002966"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.783888" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.783113" elapsed="0.000888"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.784629" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.784141" elapsed="0.000612"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.785680" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.785208" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.784843" elapsed="0.000952"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.784099" elapsed="0.001760"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.787246" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.786415" elapsed="0.000927"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.787982" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.787480" elapsed="0.000628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.789018" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:45.788522" elapsed="0.000541"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.788175" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.787439" elapsed="0.001757"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.789498" elapsed="0.000639"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:17:45.791061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.790407" elapsed="0.000752"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.791448" elapsed="0.002404"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:17:45.775326" elapsed="0.018633"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.794225" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.794072" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.794052" elapsed="0.000334"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:17:45.797684" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:17:45.794528" elapsed="0.003185"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:17:45.797810" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:45.797983" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:17:45.755885" elapsed="0.042126"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:17:45.798068" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.798216" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755822...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:17:45.755007" elapsed="0.043234"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.799420" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:45.798786" elapsed="0.000663"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:45.799541" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:45.799718" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582265, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:45.798455" elapsed="0.001290"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.800115" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.799896" elapsed="0.000246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.800489" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.800291" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:17:45.800559" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.800708" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:17:45.549774" elapsed="0.250958"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:17:45.800789" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:17:45.800958" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:17:45.548946" elapsed="0.252056"/>
</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="PASS" start="2026-04-07T17:17:45.801294" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:45.801082" elapsed="0.000441"/>
</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-07T17:17:45.801687" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.801547" 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-07T17:17:45.801900" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.801764" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.801064" elapsed="0.000925"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:45.548752" elapsed="0.253262"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.130327" elapsed="0.671721"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.802091" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:17:45.802291" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:17:45.802337" level="INFO">${follower_list} = [2, 3]</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-07T17:17:45.126342" elapsed="0.676018"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.802794" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:17:45.802868" level="INFO">${leader_count} = 1</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-07T17:17:45.802528" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.803243" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.802959" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.802942" elapsed="0.000377"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.805543" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:17:45.803448" elapsed="0.002142"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:45.805934" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.805748" elapsed="0.000211"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.806024" 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="PASS" start="2026-04-07T17:17:45.123828" elapsed="0.682351"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:17:45.123601" elapsed="0.682623"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:17:44.453920" elapsed="1.352338"/>
</for>
<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="PASS" start="2026-04-07T17:17:44.453536" elapsed="1.352773"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:17:43.154854" elapsed="2.651615"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:17:42.814834" elapsed="2.991754"/>
</test>
<test id="s1-s1-s2-t2" name="Start OVS Multiple Connections" line="21">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:45.809563" elapsed="0.000203"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:45.809308" elapsed="0.000511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.810836" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.810729" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.810710" 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-07T17:17:45.815439" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.815335" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.815317" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.816480" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:45.816105" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.816998" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:45.816659" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:45.817070" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:45.817222" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:45.815721" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.822454" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.822322" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.822298" elapsed="0.000226"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.823697" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.823593" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.823576" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.824273" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.823900" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:45.824698" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:45.824453" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:45.855495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:45.825304" elapsed="0.030350"/>
</kw>
<msg time="2026-04-07T17:17:45.855822" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:45.855868" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.824904" elapsed="0.031000"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:45.942534" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:45.856472" elapsed="0.086246"/>
</kw>
<msg time="2026-04-07T17:17:45.942885" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:45.942930" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.856086" elapsed="0.086902"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.943287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.943067" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.943048" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:45.943888" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:45.943523" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.944300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.944087" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.944069" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:45.944433" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:45.946729" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:17:45.948193" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:45.949595" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:45.945295" elapsed="0.004705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:45.944685" elapsed="0.005432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:45.823295" elapsed="0.126921"/>
</kw>
<msg time="2026-04-07T17:17:45.950307" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:45.950350" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.822670" elapsed="0.127715"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:45.950566" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:17:45.950461" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.950443" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.951044" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.951369" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.951441" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:45.821948" elapsed="0.129598"/>
</kw>
<msg time="2026-04-07T17:17:45.951638" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:45.951683" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.817613" elapsed="0.134104"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:45.952047" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:45.951791" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.951774" elapsed="0.000352"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:45.817475" elapsed="0.134673"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.957283" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.957177" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.957159" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:45.958524" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:45.958419" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:45.958401" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:45.959092" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:45.958728" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:45.959514" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:45.959270" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:45.996893" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:45.960084" elapsed="0.037026"/>
</kw>
<msg time="2026-04-07T17:17:45.997338" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:45.997384" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.959693" elapsed="0.037727"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.050942" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:45.997998" elapsed="0.053172"/>
</kw>
<msg time="2026-04-07T17:17:46.051359" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:46.051406" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.997589" elapsed="0.053852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.051752" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.051522" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.051501" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.052403" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:46.052017" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.052757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.052547" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.052529" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:46.052887" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:46.055228" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:46.056666" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:46.058117" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:46.053760" elapsed="0.004750"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:46.053187" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:45.958122" elapsed="0.100601"/>
</kw>
<msg time="2026-04-07T17:17:46.058813" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:46.058857" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.957494" elapsed="0.101398"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:46.059089" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:46.058982" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.058949" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.059552" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.059876" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:46.059947" elapsed="0.000041"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:45.956806" elapsed="0.103279"/>
</kw>
<msg time="2026-04-07T17:17:46.060177" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:46.060220" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.952400" elapsed="0.107857"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.060616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.060371" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.060352" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:45.952267" elapsed="0.108448"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:46.066151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:46.066045" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.066026" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:46.067397" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:46.067292" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.067274" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:46.067949" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:46.067599" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.068394" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:46.068143" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.101429" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:46.068946" elapsed="0.032670"/>
</kw>
<msg time="2026-04-07T17:17:46.101810" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:46.101856" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:46.068573" elapsed="0.033318"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.149236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:46.102523" elapsed="0.046913"/>
</kw>
<msg time="2026-04-07T17:17:46.149612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:46.149658" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:46.102101" elapsed="0.047592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.150039" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.149779" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.149756" elapsed="0.000387"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.150664" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:46.150283" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.151042" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.150808" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.150790" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:46.151178" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:46.153540" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:17:46.154997" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:46.156454" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:46.152061" elapsed="0.004792"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:46.151455" elapsed="0.005527"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:46.066992" elapsed="0.090093"/>
</kw>
<msg time="2026-04-07T17:17:46.157256" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:46.157300" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:46.066365" elapsed="0.090970"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:46.157520" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:46.157413" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.157394" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.158008" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.158344" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:46.158415" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:46.065688" elapsed="0.092836"/>
</kw>
<msg time="2026-04-07T17:17:46.158619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:46.158664" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:46.061009" elapsed="0.097689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:46.159062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.158774" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.158756" elapsed="0.000386"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:46.060835" elapsed="0.098330"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:45.817302" elapsed="0.341896"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:45.814979" elapsed="0.344279"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:45.810448" elapsed="0.348870"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:45.809982" elapsed="0.349384"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:45.807276" elapsed="0.352147"/>
</kw>
<kw name="Add Multiple Managers to OVS" owner="OVSDB">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.166732" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:46.166345" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.167236" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:46.166915" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:46.167311" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:46.167462" level="INFO">${index_list} = [1, 2, 3]</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-07T17:17:46.165952" elapsed="0.001534"/>
</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-07T17:17:46.169873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:46.169609" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:46.169591" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.170269" 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-07T17:17:46.170372" 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-07T17:17:46.170114" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.170920" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:17:46.170543" elapsed="0.000438"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.171548" level="INFO">${conn_id} = 239</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-07T17:17:46.171173" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:46.172491" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:46.172566" 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-07T17:17:46.172202" elapsed="0.000387"/>
</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-07T17:17:46.172740" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.173943" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:46.526423" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:39 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:46.173630" elapsed="0.352880"/>
</kw>
<msg time="2026-04-07T17:17:46.526572" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:46.173282" elapsed="0.353353"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:46.171783" elapsed="0.354938"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:46.527087" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:17:47.664410" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:47.664822" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:47.664924" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:46.526891" elapsed="1.138132"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:47.665538" elapsed="0.000668"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:47.667335" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:47.666637" elapsed="0.000822"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:47.668033" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:47.667658" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:47.667599" elapsed="0.000603"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:47.668567" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-07T17:17:47.668321" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:47.668287" elapsed="0.000479"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:47.668841" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:47.675180" elapsed="0.000588"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:47.675935" elapsed="0.000197"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:47.676274" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:47.669636" elapsed="0.006788"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:46.169077" elapsed="1.507447"/>
</kw>
<msg time="2026-04-07T17:17:47.676675" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:46.168522" elapsed="1.508212"/>
</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="PASS" start="2026-04-07T17:17:46.168044" elapsed="1.508776"/>
</kw>
<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-07T17:17:47.678879" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:47.678613" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:47.678595" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:47.679263" 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-07T17:17:47.679365" 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-07T17:17:47.679121" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:47.679932" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:17:47.679552" elapsed="0.000453"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:47.680667" level="INFO">${conn_id} = 241</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-07T17:17:47.680288" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:47.681602" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:47.681676" 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-07T17:17:47.681317" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:47.681852" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:47.683027" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:48.005862" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:46 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:47.682696" elapsed="0.323253"/>
</kw>
<msg time="2026-04-07T17:17:48.006027" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:47.682346" elapsed="0.323738"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:47.680905" elapsed="0.325262"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.006526" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:17:48.039023" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:17:48.039263" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:48.039358" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:48.006335" elapsed="0.033072"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.039757" elapsed="0.000485"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.041304" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.040609" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.041829" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:48.041575" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.041531" elapsed="0.000484"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:48.042365" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:17:48.042134" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.042100" elapsed="0.000448"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.042621" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.047718" elapsed="0.000451"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:48.048390" elapsed="0.000206"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.048794" elapsed="0.000132"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:48.043412" elapsed="0.005606"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:47.678086" elapsed="0.371058"/>
</kw>
<msg time="2026-04-07T17:17:48.049216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:47.677504" elapsed="0.371791"/>
</kw>
<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="PASS" start="2026-04-07T17:17:47.677007" elapsed="0.372397"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:17:46.167682" elapsed="1.881797"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.050046" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:48.049681" elapsed="0.000401"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.051152" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:48.050557" elapsed="0.000631"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.051731" level="INFO">  tcp:10.30.170.175:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.051401" elapsed="0.000390"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:48.050365" elapsed="0.001470"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.052718" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:48.052159" elapsed="0.000597"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.053327" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.052984" elapsed="0.000403"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:48.051961" elapsed="0.001471"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.054304" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:48.053723" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.054880" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.054553" elapsed="0.000387"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:48.053550" elapsed="0.001454"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:48.050156" elapsed="0.004889"/>
</for>
<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-07T17:17:48.057869" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:48.057574" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.057542" elapsed="0.000406"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.058237" 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-07T17:17:48.058336" 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-07T17:17:48.058109" elapsed="0.000253"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.058880" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640" on remote system "10.30.171.56" 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-07T17:17:48.058508" elapsed="0.000418"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.059628" level="INFO">${conn_id} = 243</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-07T17:17:48.059091" elapsed="0.000563"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.060560" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:48.060635" 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-07T17:17:48.060299" elapsed="0.000359"/>
</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-07T17:17:48.060810" elapsed="0.000359"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.062007" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:48.382352" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:47 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:48.061681" elapsed="0.320840"/>
</kw>
<msg time="2026-04-07T17:17:48.382651" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.061331" elapsed="0.321432"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:48.059898" elapsed="0.323044"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.383715" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640'.</msg>
<msg time="2026-04-07T17:17:48.406081" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:48.406306" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:17:48.406400" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:48.383343" elapsed="0.023107"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.406801" elapsed="0.000462"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.408255" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.407626" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.408756" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:48.408499" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.408457" elapsed="0.000447"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:48.409284" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-07T17:17:48.409054" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.409019" elapsed="0.000447"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.409541" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.415201" elapsed="0.000731"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:48.416330" elapsed="0.000270"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.416744" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:48.410220" elapsed="0.006669"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:48.056782" elapsed="0.360211"/>
</kw>
<msg time="2026-04-07T17:17:48.417046" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.056038" elapsed="0.361054"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl set-manager ${ovs_opt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:48.055308" elapsed="0.361861"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:17:48.428088" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:48.427803" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.427784" elapsed="0.000432"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.428493" 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-07T17:17:48.428594" 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-07T17:17:48.428362" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.429163" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:17:48.428768" elapsed="0.000440"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.429715" level="INFO">${conn_id} = 245</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-07T17:17:48.429360" elapsed="0.000380"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.430611" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:48.430686" 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-07T17:17:48.430350" elapsed="0.000360"/>
</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-07T17:17:48.430862" elapsed="0.000341"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.432500" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:48.736627" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:48 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:48.431713" elapsed="0.305137"/>
</kw>
<msg time="2026-04-07T17:17:48.736942" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.431367" elapsed="0.305686"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:48.429947" elapsed="0.307231"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:48.737766" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:17:48.762300" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:48.762486" level="INFO">${stdout} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-04-07T17:17:48.762549" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:48.737459" elapsed="0.025121"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.762813" elapsed="0.000362"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.763935" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.763464" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.764347" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:48.764142" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.764103" elapsed="0.000350"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:48.764675" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-07T17:17:48.764527" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:48.764506" elapsed="0.000285"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.764837" elapsed="0.000019"/>
</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-07T17:17:48.768491" elapsed="0.000460"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:48.769196" elapsed="0.000222"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:48.769618" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:48.765316" elapsed="0.004510"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:48.427279" elapsed="0.342673"/>
</kw>
<msg time="2026-04-07T17:17:48.770125" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:48.426705" elapsed="0.343492"/>
</kw>
<msg time="2026-04-07T17:17:48.770353" level="INFO">${output} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:48.426197" elapsed="0.344192"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.771010" level="INFO">f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:48.770602" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-07T17:17:48.771914" level="FAIL">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-07T17:17:48.771470" elapsed="0.000539">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:48.771169" elapsed="0.000920">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:48.771143" elapsed="0.000979">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:48.772336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:48.772190" elapsed="0.000202"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:17:48.772173" elapsed="0.000243"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.772447" elapsed="0.000014"/>
</return>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="FAIL" start="2026-04-07T17:17:48.425740" elapsed="0.346815">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:17:48.772616" elapsed="0.000015"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-04-07T17:17:48.417814" elapsed="0.354898">'f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    Manager "tcp:10.30.170.206:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:17:49.792632" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:49.792295" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:49.792266" elapsed="0.000477"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:49.793116" 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-07T17:17:49.793240" 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-07T17:17:49.792899" elapsed="0.000367"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:49.793815" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:17:49.793421" elapsed="0.000440"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:49.794419" level="INFO">${conn_id} = 247</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-07T17:17:49.794033" elapsed="0.000412"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:17:49.795843" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:17:49.795925" 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-07T17:17:49.795264" elapsed="0.000685"/>
</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-07T17:17:49.796134" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:17:49.797803" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:17:50.132688" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:48 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:17:49.796998" elapsed="0.335873"/>
</kw>
<msg time="2026-04-07T17:17:50.132958" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:49.796628" elapsed="0.336440"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:17:49.794849" elapsed="0.338336"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.133712" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:17:50.156403" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:17:50.156658" level="INFO">${stdout} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640...</msg>
<msg time="2026-04-07T17:17:50.156759" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:17:50.133439" elapsed="0.023370"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:50.157217" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.158790" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.158160" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.159404" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.159099" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.159042" elapsed="0.000524"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:17:50.159943" elapsed="0.000099"/>
</return>
<status status="PASS" start="2026-04-07T17:17:50.159683" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.159650" elapsed="0.000541"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.160267" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:50.165705" elapsed="0.000480"/>
</kw>
<kw name="Open 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-07T17:17:50.166410" elapsed="0.000222"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:50.166830" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.161001" elapsed="0.006058"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:17:49.791722" elapsed="0.375465"/>
</kw>
<msg time="2026-04-07T17:17:50.167264" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:49.791053" elapsed="0.376282"/>
</kw>
<msg time="2026-04-07T17:17:50.167497" level="INFO">${output} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640...</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:17:49.790500" elapsed="0.377034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.168144" level="INFO">f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.167765" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-07T17:17:50.168601" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:50.168301" elapsed="0.000869"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.168275" elapsed="0.000929"/>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.169578" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.169282" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.169259" elapsed="0.000502"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:17:50.169807" elapsed="0.000037"/>
</return>
<msg time="2026-04-07T17:17:50.170047" level="INFO">${output} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640...</msg>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="PASS" start="2026-04-07T17:17:49.790028" elapsed="0.380057"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:17:50.170156" elapsed="0.000036"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-04-07T17:17:49.773529" elapsed="0.396792"/>
</kw>
<msg time="2026-04-07T17:17:50.170433" level="INFO">${output} = f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640...</msg>
<var>${output}</var>
<arg>5s</arg>
<arg>1s</arg>
<arg>Verify OVS Reports Connected</arg>
<arg>${tools_system}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:17:48.417331" elapsed="1.753138"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.171052" level="INFO">f3d943fd-5b5d-45c3-80db-5eaef391c282
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.170690" elapsed="0.000427"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:50.171613" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${index_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.171328" elapsed="0.000321"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.172875" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:50.172462" elapsed="0.000449"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:17:50.172993" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:17:50.173201" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${controller_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.171950" elapsed="0.001285"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.182829" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:17:50.180933" elapsed="0.001922"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:17:50.195214" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:17:50.197319" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1376'} 
 body={"network-topology:topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]} 
 </msg>
<msg time="2026-04-07T17:17:50.197601" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${controller_http_session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_OVSDB1_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:17:50.183031" elapsed="0.014628"/>
</kw>
<kw name="Log Content" owner="Utils">
<if>
<branch type="IF" condition="'''${resp_content}''' != '${EMPTY}'">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.206184" level="INFO">${resp_json} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282",
                    "ovsdb:co...</msg>
<var>${resp_json}</var>
<arg>json.dumps(json.loads('''${resp_content}'''), sort_keys=True, indent=4, separators=(',', ': '))</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:50.205467" elapsed="0.000746"/>
</kw>
<status status="PASS" start="2026-04-07T17:17:50.203408" elapsed="0.002846"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.206426" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.206279" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.203365" elapsed="0.003139"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.206909" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282",
                    "ovsdb:connection-info": {
                        "local-ip": "10.30.170.175",
                        "local-port": 6640,
                        "remote-ip": "10.30.171.56",
                        "remote-port": 47596
                    },
                    "ovsdb:datapath-type-entry": [
                        {
                            "datapath-type": "ovsdb:datapath-type-netdev"
                        },
                        {
                            "datapath-type": "ovsdb:datapath-type-system"
                        }
                    ],
                    "ovsdb:db-version": "8.3.0",
                    "ovsdb:interface-type-entry": [
                        {
                            "interface-type": "ovsdb:interface-type-vxlan"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-tap"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-stt"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-internal"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-patch"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-lisp"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-geneve"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-gre"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-system"
                        }
                    ],
                    "ovsdb:manager-entry": [
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.171.205:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.175:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.206:6640"
                        }
                    ],
                    "ovsdb:openvswitch-external-ids": [
                        {
                            "external-id-key": "system-id",
                            "external-id-value": ""
                        },
                        {
                            "external-id-key": "hostname",
                            "external-id-value": "localhost"
                        },
                        {
                            "external-id-key": "rundir",
                            "external-id-value": "/var/run/openvswitch"
                        }
                    ],
                    "ovsdb:ovs-version": "2.17.11"
                }
            ],
            "topology-id": "ovsdb:1"
        }
    ]
}</msg>
<arg>${resp_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.206645" elapsed="0.000400"/>
</kw>
<return>
<value>${resp_json}</value>
<status status="PASS" start="2026-04-07T17:17:50.207094" elapsed="0.000031"/>
</return>
<arg>${resp.text}</arg>
<status status="PASS" start="2026-04-07T17:17:50.198312" elapsed="0.008911"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.210177" level="INFO">${json_data} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:17:50.209728" elapsed="0.000477"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:17:50.210254" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:50.210433" level="INFO">${resp_json} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:17:50.207428" elapsed="0.003032"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.210837" level="INFO">${topologies} = [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-ty...</msg>
<var>${topologies}</var>
<arg>${resp_json}</arg>
<arg>network-topology:topology</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.210613" elapsed="0.000251"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:17:50.211247" level="INFO">${topology} = {'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-typ...</msg>
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.211036" elapsed="0.000238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.211622" level="INFO">${node_list} = [{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsd...</msg>
<var>${node_list}</var>
<arg>${topology}</arg>
<arg>node</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.211423" elapsed="0.000226"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.212088" level="INFO">[{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb:interface-type-tap'}, {'interface-type': 'ovsdb:interface-type-stt'}, {'interface-type': 'ovsdb:interface-type-internal'}, {'interface-type': 'ovsdb:interface-type-patch'}, {'interface-type': 'ovsdb:interface-type-lisp'}, {'interface-type': 'ovsdb:interface-type-geneve'}, {'interface-type': 'ovsdb:interface-type-gre'}, {'interface-type': 'ovsdb:interface-type-system'}], 'ovsdb:ovs-version': '2.17.11', 'ovsdb:connection-info': {'local-port': 6640, 'remote-port': 47596, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}, 'ovsdb:openvswitch-external-ids': [{'external-id-key': 'system-id', 'external-id-value': ''}, {'external-id-key': 'hostname', 'external-id-value': 'localhost'}, {'external-id-key': 'rundir', 'external-id-value': '/var/run/openvswitch'}], 'ovsdb:datapath-type-entry': [{'datapath-type': 'ovsdb:datapath-type-netdev'}, {'datapath-type': 'ovsdb:datapath-type-system'}], 'ovsdb:manager-entry': [{'target': 'tcp:10.30.171.205:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.175:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.206:6640', 'number_of_connections': 1, 'connected': True}]}]</msg>
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.211805" elapsed="0.000550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.212940" level="INFO">${node_id} = ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${node_id}</var>
<arg>${node}</arg>
<arg>node-id</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.212757" elapsed="0.000208"/>
</kw>
<kw name="Replace String" owner="String">
<msg time="2026-04-07T17:17:50.215110" level="INFO">${node_uuid} = f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${node_uuid}</var>
<arg>${node_id}</arg>
<arg>ovsdb://uuid/</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.213157" elapsed="0.001979"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.215644" elapsed="0.000145"/>
</kw>
<msg time="2026-04-07T17:17:50.215883" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.215931" level="INFO">${connection_info} = {'local-port': 6640, 'remote-port': 47596, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}</msg>
<var>${status}</var>
<var>${connection_info}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.215304" elapsed="0.000650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.216462" elapsed="0.000147"/>
</kw>
<msg time="2026-04-07T17:17:50.216702" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.216744" level="INFO">${remote_ip} = 10.30.171.56</msg>
<var>${status}</var>
<var>${remote_ip}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.216134" elapsed="0.000632"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.217374" level="INFO">${uuid} = f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${uuid}</var>
<arg>'${remote_ip}' == '${ovs_system_ip}'</arg>
<arg>${node_uuid}</arg>
<arg>${uuid}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:50.216958" elapsed="0.000441"/>
</kw>
<var name="${node}">{'node-id': 'ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb...</var>
<status status="PASS" start="2026-04-07T17:17:50.212623" elapsed="0.004816"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="PASS" start="2026-04-07T17:17:50.212416" elapsed="0.005056"/>
</for>
<return>
<value>${uuid}</value>
<status status="PASS" start="2026-04-07T17:17:50.217566" elapsed="0.000028"/>
</return>
<arg>controller_http_session=${session}</arg>
<doc>Queries the topology in the operational datastore and searches for the node that has
the ${ovs_system_ip} argument as the "remote-ip". If found, the value returned will be the value of
node-id stripped of "ovsdb://uuid/". If not found,  will be returned.</doc>
<status status="PASS" start="2026-04-07T17:17:50.180501" elapsed="0.037187"/>
</kw>
<msg time="2026-04-07T17:17:50.217767" level="INFO">${ovsdb_uuid} = f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${ovsdb_uuid}</var>
<arg>30s</arg>
<arg>2s</arg>
<arg>OVSDB.Get OVSDB UUID</arg>
<arg>controller_http_session=${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:17:50.173456" elapsed="0.044335"/>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="PASS" start="2026-04-07T17:17:50.217841" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:17:50.218004" level="INFO">${ovsdb_uuid} = f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${ovsdb_uuid}</var>
<doc>Connect OVS to the list of controllers in the ${controller_index_list} or all if no list is provided.</doc>
<status status="PASS" start="2026-04-07T17:17:46.163659" elapsed="4.054372"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.218519" level="INFO">${ovsdb_uuid} = f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>${ovsdb_uuid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-07T17:17:50.218196" elapsed="0.000366"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="PASS" start="2026-04-07T17:17:45.806794" elapsed="4.411891"/>
</test>
<test id="s1-s1-s2-t3" name="Check Entity Owner Status And Find Owner and Candidate Before Fail" line="26">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:17:50.222129" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:17:50.221856" 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-07T17:17:50.223396" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.223286" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.223267" 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-07T17:17:50.227994" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.227875" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.227858" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.229039" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:50.228648" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.229522" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:50.229220" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:50.229591" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:50.229742" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:50.228280" elapsed="0.001486"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.234858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.234751" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.234732" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.236157" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.236050" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.236032" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.236712" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.236359" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.237163" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:50.236892" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.270019" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:50.237721" elapsed="0.032474"/>
</kw>
<msg time="2026-04-07T17:17:50.270362" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:50.270408" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.237344" elapsed="0.033099"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.351377" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:50.271015" elapsed="0.080611"/>
</kw>
<msg time="2026-04-07T17:17:50.351797" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:50.351843" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.270610" elapsed="0.081269"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.352220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.351956" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.351936" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.352828" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.352459" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.353221" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.353009" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.352989" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:50.353356" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:50.355661" elapsed="0.000539"/>
</kw>
<kw name="Open 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-07T17:17:50.357133" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:50.358553" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.354206" elapsed="0.004742"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:50.353614" elapsed="0.005465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:50.235721" elapsed="0.123459"/>
</kw>
<msg time="2026-04-07T17:17:50.359270" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.359313" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.235087" elapsed="0.124263"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:50.359533" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:50.359426" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.359407" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.360049" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.360381" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.360451" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:50.234416" elapsed="0.126142"/>
</kw>
<msg time="2026-04-07T17:17:50.360649" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.360692" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.230130" elapsed="0.130598"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.361063" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.360803" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.360786" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:17:50.229993" elapsed="0.131173"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.366478" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.366371" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.366353" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.367784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.367675" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.367647" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.368376" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.368022" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.368800" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:50.368554" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.402600" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:50.369377" elapsed="0.033395"/>
</kw>
<msg time="2026-04-07T17:17:50.402941" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:50.403017" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.368997" elapsed="0.034058"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.487919" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:50.403607" elapsed="0.084537"/>
</kw>
<msg time="2026-04-07T17:17:50.488314" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:50.488359" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.403222" elapsed="0.085174"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.488699" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.488473" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.488453" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.489336" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.488941" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.489737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.489507" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.489489" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:50.489876" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:50.492357" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.493837" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:50.495245" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.490889" elapsed="0.004744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:50.490151" elapsed="0.005599"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:50.367364" elapsed="0.128486"/>
</kw>
<msg time="2026-04-07T17:17:50.495942" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.496002" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.366730" elapsed="0.129311"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:50.496225" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:17:50.496119" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.496100" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.496736" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.497096" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.497168" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:50.365819" elapsed="0.131468"/>
</kw>
<msg time="2026-04-07T17:17:50.497379" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.497422" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.361422" elapsed="0.136036"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.497773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.497531" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.497514" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:17:50.361287" elapsed="0.136586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.503221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.503114" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.503095" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.504482" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.504376" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.504359" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.505055" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.504687" elapsed="0.000415"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.505529" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:17:50.505257" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.535438" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:17:50.506112" elapsed="0.029486"/>
</kw>
<msg time="2026-04-07T17:17:50.535763" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:17:50.535809" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.505713" elapsed="0.030132"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:17:50.618353" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:17:50.536408" elapsed="0.082189"/>
</kw>
<msg time="2026-04-07T17:17:50.618795" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:17:50.618841" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.536026" elapsed="0.082856"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.619272" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.619003" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.618947" elapsed="0.000430"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.619922" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:17:50.619517" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.620364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.620152" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.620133" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:17:50.620498" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:17:50.622875" elapsed="0.000558"/>
</kw>
<kw name="Open 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-07T17:17:50.624366" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:17:50.625781" elapsed="0.000359"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.621398" elapsed="0.004814"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:17:50.620778" elapsed="0.005547"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:17:50.504079" elapsed="0.122346"/>
</kw>
<msg time="2026-04-07T17:17:50.626516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.626561" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.503437" elapsed="0.123161"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:17:50.626781" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:17:50.626675" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.626656" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.627289" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.627853" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.627930" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:17:50.502760" elapsed="0.125295"/>
</kw>
<msg time="2026-04-07T17:17:50.628149" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:17:50.628193" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.498246" elapsed="0.129982"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.628547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:17:50.628302" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.628285" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:17:50.498110" elapsed="0.130538"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:17:50.229815" elapsed="0.398865"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:17:50.227518" elapsed="0.401222"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:17:50.223000" elapsed="0.405800"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.222555" elapsed="0.406294"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:17:50.219545" elapsed="0.409362"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:17:50.662775" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:50.662381" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.663275" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:50.662957" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:50.663345" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:50.663549" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:50.661999" elapsed="0.001575"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:50.668123" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:50.667922" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:50.668580" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.668298" elapsed="0.000366">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.668828" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669032" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669188" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669345" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669521" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669680" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.669852" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.670045" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.679991" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.680187" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.689908" 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-07T17:17:50.690119" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.690186" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.667385" elapsed="0.022924">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:50.690420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:50.690463" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.666811" elapsed="0.023674"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.690675" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:50.690566" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:50.690548" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:50.692052" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.692805" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:50.692458" elapsed="0.000373"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:50.693679" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:50.693383" elapsed="0.000323"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:50.693752" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:50.693906" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:50.693045" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.694475" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:50.694109" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.695012" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:50.694654" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:50.695448" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:50.710454" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:50.695197" elapsed="0.019316">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.714920" elapsed="0.000103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.715356" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.715714" 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-07T17:17:50.716115" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.716489" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.716835" 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-07T17:17:50.717492" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.717867" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.718116" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:50.717209" elapsed="0.000983"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.717011" elapsed="0.001218"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.718419" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.718501" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.691501" elapsed="0.027148">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:50.718805" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:50.718865" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:50.690884" elapsed="0.028013"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:50.719765" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.719326" elapsed="0.000521">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:50.719033" elapsed="0.000900">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:50.719006" elapsed="0.001048">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.720125" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.666269" elapsed="0.053995">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.720505" 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-07T17:17:50.720733" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.720817" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:50.663873" elapsed="0.057080">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.721216" 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-07T17:17:50.721458" 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-07T17:17:50.721686" 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-07T17:17:50.721938" elapsed="0.000057"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:50.722210" 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-07T17:17:50.722431" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:50.722514" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.661386" elapsed="0.061265">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:51.754588" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:51.754076" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:51.755145" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:51.754795" elapsed="0.000376"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:51.755220" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:17:51.755405" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:51.753673" elapsed="0.001756"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:51.760023" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:51.759815" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:51.760440" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.760199" elapsed="0.000504">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.760875" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761099" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761258" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761416" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761592" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761752" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.761924" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.762099" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.771860" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.772067" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.781829" 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-07T17:17:51.782036" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.782104" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.759283" elapsed="0.022942">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:51.782338" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:51.782381" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:51.758695" elapsed="0.023709"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.782635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:51.782517" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:51.782494" 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-07T17:17:51.784033" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:51.784705" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:51.784394" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:51.785683" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:51.785416" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:51.785757" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:51.785903" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:51.784912" elapsed="0.001015"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:51.786476" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:51.786097" elapsed="0.000405"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:51.787060" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:51.786694" elapsed="0.000392"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:51.787482" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:51.799930" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:51.787245" elapsed="0.016573">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.804259" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.804636" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.805019" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.805385" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.805752" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.806161" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.806752" 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-07T17:17:51.807150" 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-07T17:17:51.807504" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:51.806474" elapsed="0.001147"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.806317" elapsed="0.001365"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.808011" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.808147" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.783483" elapsed="0.024904">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:51.808633" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:51.808728" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:51.782851" elapsed="0.025927"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:51.810227" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.809459" elapsed="0.000917">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:51.808961" elapsed="0.001556">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:51.808920" elapsed="0.001669">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.810689" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.758154" elapsed="0.052754">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.811267" 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-07T17:17:51.811431" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.811493" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:51.755727" elapsed="0.055865">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:51.811755" 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-07T17:17:51.811928" 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-07T17:17:51.812110" 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-07T17:17:51.812267" 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-07T17:17:51.812428" 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-07T17:17:51.812587" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:51.812647" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:51.752877" elapsed="0.059868">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:52.844667" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:52.844245" elapsed="0.000451"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:52.845180" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:52.844854" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:52.845250" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:17:52.845412" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:52.843854" elapsed="0.001581"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:52.850226" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:52.850029" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:52.850624" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.850400" elapsed="0.000289">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.850849" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851061" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851217" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851372" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851601" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851762" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.851934" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.852107" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.861854" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.862076" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.871907" 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-07T17:17:52.872110" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.872176" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.849482" elapsed="0.022805">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:52.872398" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:52.872441" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:52.848911" elapsed="0.023552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.872658" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:52.872546" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:52.872527" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:52.874059" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:52.874726" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:52.874419" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:52.875543" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:52.875281" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:52.875617" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:52.875764" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:52.874932" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:52.876324" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:52.875944" elapsed="0.000406"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:52.876843" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:52.876502" elapsed="0.000366"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:52.877267" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:52.886946" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:52.877037" elapsed="0.013599">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.891158" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.891540" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.891900" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.892298" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.892672" 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-07T17:17:52.893056" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.893653" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.894063" 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-07T17:17:52.894418" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:52.893357" elapsed="0.001177"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.893205" elapsed="0.001388"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.894895" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.895055" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.873487" elapsed="0.021809">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:52.895544" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:52.895640" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:52.872868" elapsed="0.022825"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:52.897109" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.896374" elapsed="0.000871">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:52.895874" elapsed="0.001507">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:52.895833" elapsed="0.001618">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.897589" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.848363" elapsed="0.049450">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.898250" 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-07T17:17:52.898420" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.898480" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:52.845725" elapsed="0.052852">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:52.898786" 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-07T17:17:52.898960" 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-07T17:17:52.899143" 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-07T17:17:52.899300" 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-07T17:17:52.899461" 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-07T17:17:52.899619" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:52.899678" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:52.843205" elapsed="0.056571">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:53.928834" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:53.928384" elapsed="0.000482"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:53.929355" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:53.929044" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:53.929426" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:17:53.929595" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:53.928002" elapsed="0.001617"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:53.936513" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:53.936325" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:53.936916" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.936686" elapsed="0.000316">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.937166" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.937360" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.937514" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.937671" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.937845" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.938016" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.938191" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.938347" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.948251" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.948501" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.958286" 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-07T17:17:53.958477" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.958543" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.935757" elapsed="0.022900">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:53.958769" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:53.958813" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:53.935205" elapsed="0.023631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.959054" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:53.958923" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:53.958903" 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-07T17:17:53.960427" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:53.961112" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:53.960788" elapsed="0.000350"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:53.961911" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:53.961650" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:53.962000" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:53.962150" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:53.961318" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:53.962696" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:53.962334" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:53.963238" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:53.962874" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:53.963666" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:53.977046" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:53.963417" elapsed="0.017282">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.981133" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.981515" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.981876" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.982279" 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-07T17:17:53.982653" 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-07T17:17:53.983040" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.983763" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.984170" 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-07T17:17:53.984526" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:53.983479" elapsed="0.001164"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.983318" elapsed="0.001385"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.985036" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.985171" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.959871" elapsed="0.025545">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:53.985666" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:53.985762" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:53.959268" elapsed="0.026546"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:53.987277" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.986500" elapsed="0.000917">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:53.986025" elapsed="0.001531">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:53.985955" elapsed="0.001672">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.987727" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.934640" elapsed="0.053303">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.988304" elapsed="0.000076"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.988528" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.988589" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:53.929912" elapsed="0.058775">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:53.988847" 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-07T17:17:53.989040" 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-07T17:17:53.989207" 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-07T17:17:53.989364" 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-07T17:17:53.989523" 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-07T17:17:53.989680" elapsed="0.000050"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:53.989774" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:53.927290" elapsed="0.062582">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:55.019568" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:55.019147" elapsed="0.000449"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:55.020073" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:55.019752" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:55.020144" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:17:55.020301" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:55.018761" elapsed="0.001564"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:55.024803" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:55.024622" elapsed="0.000207"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:55.025206" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.024988" elapsed="0.000280">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.025429" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.025617" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.025771" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.025928" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.026122" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.026282" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.026453" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.026610" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.036578" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.036773" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.046547" 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-07T17:17:55.046740" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.046847" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.024093" elapsed="0.022865">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:55.047106" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:55.047151" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:55.023527" elapsed="0.023647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.047368" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:55.047257" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:55.047238" 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-07T17:17:55.048720" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:55.049396" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:55.049092" elapsed="0.000330"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:55.050213" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:55.049936" elapsed="0.000303"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:55.050287" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:55.050433" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:55.049602" elapsed="0.000855"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:55.051003" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:55.050620" elapsed="0.000423"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:55.051546" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:55.051197" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:55.051937" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:55.065117" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:55.051729" elapsed="0.015775">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.067759" 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-07T17:17:55.068017" 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-07T17:17:55.068247" 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-07T17:17:55.068472" 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-07T17:17:55.068706" 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-07T17:17:55.068930" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.069315" 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-07T17:17:55.069548" 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-07T17:17:55.069763" elapsed="0.000027"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:55.069138" elapsed="0.000697"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.069042" elapsed="0.000829"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.070076" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.070160" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.048187" elapsed="0.022174">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:55.070522" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:55.070583" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:55.047578" elapsed="0.023037"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:55.071552" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.071092" elapsed="0.000544">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:55.070732" elapsed="0.000991">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:55.070707" elapsed="0.001061">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.071832" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.022950" elapsed="0.049035">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.072231" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.072458" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.072544" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:55.020614" elapsed="0.052068">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.072907" 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-07T17:17:55.073174" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:55.073415" 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-07T17:17:55.073633" 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-07T17:17:55.073859" 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-07T17:17:55.074099" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:55.074186" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:55.018128" elapsed="0.056193">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:56.105159" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:56.104733" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:56.105654" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:56.105345" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:56.105725" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:56.105883" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:56.104300" elapsed="0.001608"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:56.110475" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:56.110291" elapsed="0.000211"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:56.110867" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.110648" elapsed="0.000283">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111108" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111300" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111459" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111621" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111799" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.111957" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.112146" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.112302" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.122270" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.122467" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.132484" elapsed="0.000045"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.132704" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.132771" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.109739" elapsed="0.023151">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:56.133017" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:56.133062" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:56.109179" elapsed="0.023906"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.133323" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:56.133168" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:56.133150" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:56.134729" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:56.135415" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:56.135106" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:56.136423" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:56.136140" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:56.136503" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:56.136653" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:56.135624" elapsed="0.001054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:56.137220" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:56.136835" elapsed="0.000412"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:56.137756" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:56.137401" elapsed="0.000381"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:56.138169" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:56.150796" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:56.137942" elapsed="0.015947">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.154329" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.154707" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.155096" 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-07T17:17:56.155458" 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-07T17:17:56.155827" 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-07T17:17:56.156229" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.156803" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.157204" 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-07T17:17:56.157558" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:56.156528" elapsed="0.001149"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.156378" elapsed="0.001356"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.158061" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.158196" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.134184" elapsed="0.024253">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:56.158690" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:56.158786" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:56.133548" elapsed="0.025289"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:56.160434" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.159650" elapsed="0.000935">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:56.159145" elapsed="0.001512">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:56.159101" elapsed="0.001588">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.160734" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.108618" elapsed="0.052213">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.161016" 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-07T17:17:56.161178" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.161240" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:56.106219" elapsed="0.055120">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:56.161505" 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-07T17:17:56.161677" 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-07T17:17:56.161840" 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-07T17:17:56.162011" 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-07T17:17:56.162176" 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-07T17:17:56.162336" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:56.162396" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:56.103646" elapsed="0.058848">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:57.191583" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:57.191179" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:57.192092" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:57.191769" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:57.192162" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:17:57.192323" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:57.190779" 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-07T17:17:57.197117" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:57.196918" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:57.197512" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.197288" elapsed="0.000286">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.197735" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.197927" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198098" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198257" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198432" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198590" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198761" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.198916" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.208666" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.208857" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.218635" 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-07T17:17:57.218822" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.218887" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.196386" elapsed="0.022652">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:57.219153" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:57.219196" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:57.195816" elapsed="0.023404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.219410" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:57.219301" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:57.219283" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:57.220762" elapsed="0.000220"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:57.221438" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:57.221132" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:57.222250" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:57.221988" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:57.222358" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:57.222508" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:57.221643" elapsed="0.000889"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:57.223092" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:57.222692" elapsed="0.000426"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:57.223615" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:57.223272" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:57.224022" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:57.236874" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:57.223798" elapsed="0.015472">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.239522" 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-07T17:17:57.239755" 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-07T17:17:57.239998" elapsed="0.000030"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.240226" 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-07T17:17:57.240453" 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-07T17:17:57.240671" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.241044" 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-07T17:17:57.241274" 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-07T17:17:57.241488" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:57.240854" elapsed="0.000707"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.240760" elapsed="0.000837"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.241781" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.241861" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.220226" elapsed="0.021802">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:57.242185" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:57.242246" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:57.219619" elapsed="0.022659"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:57.243173" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.242679" elapsed="0.000576">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:57.242391" elapsed="0.000950">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:57.242366" elapsed="0.001019">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.243447" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.195273" elapsed="0.048310">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.243872" 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-07T17:17:57.244119" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.244206" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:57.192689" elapsed="0.051655">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.244569" 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-07T17:17:57.244808" 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-07T17:17:57.245058" 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-07T17:17:57.245278" 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-07T17:17:57.245500" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:57.245719" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:57.245803" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:57.190143" elapsed="0.055796">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:58.275834" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:58.275343" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:58.276366" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:58.276049" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:58.276439" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:17:58.276616" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:58.274930" 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-07T17:17:58.281496" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:58.281307" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:58.281898" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.281667" elapsed="0.000321">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.282150" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.282349" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.282502" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.282659" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.282918" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.283107" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.283282" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.283439" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.293230" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.293424" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.303307" 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-07T17:17:58.303497" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.303563" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.280759" elapsed="0.022921">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:58.303790" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:58.303832" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:58.280203" elapsed="0.023652"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.304072" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:58.303942" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:58.303922" 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-07T17:17:58.305436" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:58.306116" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:58.305792" elapsed="0.000351"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:58.306939" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:58.306654" elapsed="0.000327"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:58.307030" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:17:58.307178" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:58.306324" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:58.307723" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:58.307356" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:58.308260" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:58.307900" elapsed="0.000385"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:58.308665" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:58.320467" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:58.308441" elapsed="0.015651">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.324568" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.324942" elapsed="0.000073"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.325331" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.325687" 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-07T17:17:58.326089" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.326446" 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-07T17:17:58.327071" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.327443" 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-07T17:17:58.327789" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:58.326767" elapsed="0.001137"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.326593" elapsed="0.001369"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.328295" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.328423" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.304882" elapsed="0.023779">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:58.328905" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:58.329040" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:58.304283" elapsed="0.024812"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:58.330462" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.329736" elapsed="0.000856">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:58.329275" elapsed="0.001495">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:58.329236" elapsed="0.001608">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.330945" elapsed="0.000061"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.279642" elapsed="0.051553">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.331576" elapsed="0.000054"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.331874" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.331934" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:58.276935" elapsed="0.055111">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:58.332253" 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-07T17:17:58.332427" 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-07T17:17:58.332591" 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-07T17:17:58.332749" 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-07T17:17:58.332910" 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-07T17:17:58.333085" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:58.333147" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:58.274150" elapsed="0.059095">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:17:59.365511" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:59.365117" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:17:59.366021" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:17:59.365693" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:17:59.366092" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:17:59.366248" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:17:59.364737" elapsed="0.001535"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:17:59.370900" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:17:59.370719" elapsed="0.000207"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:17:59.371300" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.371086" elapsed="0.000280">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.371526" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.371709" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.371884" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.372061" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.372240" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.372397" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.372568" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.372722" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.382459" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.382698" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.392585" 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-07T17:17:59.392777" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.392842" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.370189" elapsed="0.022762">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:17:59.393076" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:59.393120" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:59.369622" elapsed="0.023520"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.393333" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:17:59.393224" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:17:59.393206" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:17:59.394681" elapsed="0.000205"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:17:59.395350" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:17:59.395048" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:17:59.396190" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:17:59.395913" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:17:59.396263" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:17:59.396409" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:17:59.395551" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:17:59.396953" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:17:59.396588" elapsed="0.000409"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:17:59.397492" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:17:59.397150" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:17:59.397871" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:17:59.410890" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:17:59.397670" elapsed="0.016469">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.414575" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.414962" elapsed="0.000074"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.415351" 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-07T17:17:59.415726" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.416131" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.416485" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.417206" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.417586" 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-07T17:17:59.417934" elapsed="0.000073"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:17:59.416895" elapsed="0.001186"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.416744" elapsed="0.001395"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.418441" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.418573" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.394150" elapsed="0.024662">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:17:59.419091" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:17:59.419190" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:17:59.393543" elapsed="0.025699"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:17:59.420662" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.419937" elapsed="0.000875">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:17:59.419424" elapsed="0.001509">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:17:59.419384" elapsed="0.001597">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.421028" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.369080" elapsed="0.052046">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.421297" 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-07T17:17:59.421457" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.421516" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:17:59.366564" elapsed="0.055050">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.421774" elapsed="0.000117"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:17:59.422070" 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-07T17:17:59.422236" 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-07T17:17:59.422393" 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-07T17:17:59.422553" 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-07T17:17:59.422710" elapsed="0.000050"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:17:59.422803" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:17:59.364123" elapsed="0.058780">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:00.455619" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:00.455225" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:00.456122" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:00.455801" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:00.456192" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:00.456348" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:00.454842" elapsed="0.001530"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:00.460999" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:00.460800" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:00.461380" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.461169" elapsed="0.000272">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.461597" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.461794" elapsed="0.000026"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.461952" elapsed="0.000039"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.462130" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.462306" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.462463" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.462636" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.462792" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.472495" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.472684" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.482367" 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-07T17:18:00.482554" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.482662" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.460276" elapsed="0.022496">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:00.482882" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:00.482925" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:00.459715" elapsed="0.023233"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.483159" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:00.483049" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:00.483030" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:00.484587" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:00.485266" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:00.484944" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:00.486092" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:00.485815" elapsed="0.000303"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:00.486166" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:00.486313" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:00.485471" elapsed="0.000866"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:00.486856" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:00.486493" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:00.487393" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:00.487048" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:00.487778" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:00.503336" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:00.487576" elapsed="0.019535">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.507519" 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-07T17:18:00.507889" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.508282" 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-07T17:18:00.508641" 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-07T17:18:00.509043" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.509420" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.510027" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.510400" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.510743" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:00.509723" elapsed="0.001137"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.509571" elapsed="0.001346"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.511252" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.511384" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.483952" elapsed="0.027751">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:00.511959" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:00.512090" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:00.483366" elapsed="0.028778"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:00.513578" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.512796" elapsed="0.000917">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:00.512329" elapsed="0.001527">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:00.512289" elapsed="0.001648">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.514074" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.459180" elapsed="0.054998">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.514350" 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-07T17:18:00.514510" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.514571" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:00.456662" elapsed="0.058005">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:00.514827" 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-07T17:18:00.515012" 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-07T17:18:00.515178" 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-07T17:18:00.515332" 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-07T17:18:00.515491" 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-07T17:18:00.515647" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:00.515707" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:00.454232" elapsed="0.061571">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:01.545808" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:01.545278" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:01.546392" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:01.546065" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:01.546468" elapsed="0.000050"/>
</return>
<msg time="2026-04-07T17:18:01.546657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:01.544750" elapsed="0.001931"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:01.551309" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:01.551109" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:01.551734" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.551485" elapsed="0.000332">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.552288" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.552512" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.552670" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.552827" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.553025" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.553188" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.553364" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.553520" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.563534" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.563729" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.573471" 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-07T17:18:01.573661" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.573727" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.550552" elapsed="0.023294">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:01.573962" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:01.574021" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:01.549958" elapsed="0.024086"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.574294" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:01.574134" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:01.574114" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:01.575717" elapsed="0.000237"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:01.576515" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:01.576147" elapsed="0.000394"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:01.577348" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:01.577082" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:01.577431" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:01.577592" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:01.576728" elapsed="0.000896"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:01.578224" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:01.577799" elapsed="0.000460"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:01.578823" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:01.578429" elapsed="0.000421"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:01.579304" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:01.593098" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:01.579049" elapsed="0.017123">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.596584" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.597006" elapsed="0.000057"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.597395" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.597758" 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-07T17:18:01.598191" 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-07T17:18:01.598557" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.599216" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.599593" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.599940" elapsed="0.000102"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:01.598870" elapsed="0.001263"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.598709" elapsed="0.001494"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.600516" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.600647" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.575138" elapsed="0.025752">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:01.601186" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:01.601283" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:01.574513" elapsed="0.026821"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:01.602862" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.602137" elapsed="0.000894">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:01.601605" elapsed="0.001568">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:01.601562" elapsed="0.001682">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.603372" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.549411" elapsed="0.054187">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.604108" elapsed="0.000068"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.604520" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.604661" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:01.547000" elapsed="0.057889">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:01.605203" 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-07T17:18:01.605377" 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-07T17:18:01.605543" 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-07T17:18:01.605697" 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-07T17:18:01.605860" 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-07T17:18:01.606032" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:01.606095" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:01.543876" elapsed="0.062318">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:02.636467" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:02.635961" elapsed="0.000541"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:02.636998" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:02.636671" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:02.637074" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:18:02.637257" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:02.635576" 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-07T17:18:02.642028" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:02.641819" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:02.642441" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.642202" elapsed="0.000316">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.642680" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.642885" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.643057" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.643221" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.643397" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.643567" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.643840" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.644027" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.653869" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.654073" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.663916" 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-07T17:18:02.664120" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.664187" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.641282" elapsed="0.023026">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:02.664420" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:02.664462" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:02.640706" elapsed="0.023779"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.664694" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:02.664576" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:02.664555" 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-07T17:18:02.666082" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:02.666757" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:02.666445" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:02.667763" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:02.667317" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:02.667879" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:02.668049" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:02.666982" elapsed="0.001092"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:02.668605" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:02.668231" elapsed="0.000401"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:02.669150" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:02.668787" elapsed="0.000388"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:02.669568" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:02.679732" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:02.669335" elapsed="0.013887">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.683655" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.684063" elapsed="0.000051"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.684433" 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-07T17:18:02.684796" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.685206" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.685567" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.686179" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.686556" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.686900" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:02.685872" elapsed="0.001174"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.685717" elapsed="0.001393"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.687434" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.687570" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.665529" elapsed="0.022283">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:02.688094" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:02.688194" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:02.664910" elapsed="0.023336"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:02.689676" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.688897" elapsed="0.000911">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:02.688429" elapsed="0.001515">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:02.688388" elapsed="0.001662">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.690170" elapsed="0.000040"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.640157" elapsed="0.050252">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.690883" elapsed="0.000050"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.691329" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.691476" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:02.637657" elapsed="0.054043">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:02.692098" 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-07T17:18:02.692291" 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-07T17:18:02.692456" 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-07T17:18:02.692612" 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-07T17:18:02.692772" 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-07T17:18:02.692930" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:02.693005" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:02.634783" elapsed="0.058321">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:03.723722" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:03.723219" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:03.724259" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:03.723925" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:03.724333" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:18:03.724511" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:03.722814" 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-07T17:18:03.729412" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:03.729223" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:03.729818" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.729585" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.730067" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.730270" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.730425" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.730582" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.730847" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.731024" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.731199" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.731370" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.741246" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.741439" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.751282" 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-07T17:18:03.751480" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.751547" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.728672" elapsed="0.022991">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:03.751775" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:03.751818" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:03.728107" elapsed="0.023734"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.752065" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:03.751928" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:03.751908" 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-07T17:18:03.753428" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:03.754121" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:03.753788" elapsed="0.000359"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:03.754922" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:03.754661" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:03.755012" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:03.755175" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:03.754329" elapsed="0.000871"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:03.755722" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:03.755357" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:03.756261" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:03.755899" elapsed="0.000388"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:03.756671" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:03.769252" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:03.756443" elapsed="0.015622">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.772559" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.772944" elapsed="0.000080"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.773346" 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-07T17:18:03.773712" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.774119" 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-07T17:18:03.774482" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.775117" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.775501" 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-07T17:18:03.775858" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:03.774785" elapsed="0.001223"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.774631" elapsed="0.001440"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.776375" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.776508" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.752877" elapsed="0.023876">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:03.777037" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:03.777141" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:03.752277" elapsed="0.024918"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:03.778593" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.777851" elapsed="0.000875">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:03.777382" elapsed="0.001484">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:03.777341" elapsed="0.001597">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.779114" elapsed="0.000039"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.727545" elapsed="0.051801">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.779734" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.780128" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.780282" elapsed="0.000038"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:03.724834" elapsed="0.055596">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:03.780633" 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-07T17:18:03.780808" 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-07T17:18:03.780989" 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-07T17:18:03.781150" 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-07T17:18:03.781316" 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-07T17:18:03.781474" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:03.781534" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:03.722057" elapsed="0.059576">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:04.813789" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:04.813351" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:04.814307" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:04.813995" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:04.814378" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:18:04.814547" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:04.812958" elapsed="0.001613"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:04.819099" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:04.818895" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:04.819498" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.819270" elapsed="0.000520">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.819958" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.820172" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.820328" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.820489" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.820663" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.820822" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.821007" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.821164" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.831131" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.831397" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.841115" 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-07T17:18:04.841305" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.841376" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.818365" elapsed="0.023124">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:04.841600" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:04.841643" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:04.817798" elapsed="0.023867"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.841864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:04.841748" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:04.841729" 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-07T17:18:04.843329" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:04.844036" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:04.843703" elapsed="0.000360"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:04.844843" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:04.844582" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:04.844915" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:04.845079" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:04.844245" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:04.845620" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:04.845257" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:04.846156" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:04.845799" elapsed="0.000383"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:04.846565" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:04.858510" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:04.846340" elapsed="0.015129">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.861873" 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-07T17:18:04.862285" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.862650" 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-07T17:18:04.863039" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.863420" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.863792" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.864490" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.864863" 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-07T17:18:04.865246" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:04.864208" elapsed="0.001169"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.864046" elapsed="0.001401"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.865768" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.865898" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.842687" elapsed="0.023483">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:04.866424" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:04.866522" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:04.842091" elapsed="0.024483"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:04.868037" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.867260" elapsed="0.000913">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:04.866757" elapsed="0.001560">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:04.866717" elapsed="0.001684">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.868474" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.817260" elapsed="0.051323">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.868755" elapsed="0.000244"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.869152" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.869215" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:04.814865" elapsed="0.054453">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:04.869482" 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-07T17:18:04.869653" 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-07T17:18:04.869816" 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-07T17:18:04.869993" 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-07T17:18:04.870157" 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-07T17:18:04.870315" elapsed="0.000058"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:04.870417" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:04.812266" elapsed="0.058253">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:05.903214" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:05.902686" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:05.903744" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:05.903424" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:05.903820" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:18:05.904017" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:05.902293" elapsed="0.001750"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:05.908633" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:05.908438" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:05.909066" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.908809" elapsed="0.000339">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.909311" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.909521" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.909676" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.909833" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.910024" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.910186" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.910358" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.910513" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.920520" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.920733" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.930406" 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-07T17:18:05.930598" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.930738" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.907866" elapsed="0.022998">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:05.930992" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:05.931038" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:05.907304" elapsed="0.023757"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.931274" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:05.931152" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:05.931131" 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-07T17:18:05.932686" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:05.933381" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:05.933068" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:05.934205" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:05.933925" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:05.934278" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:05.934425" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:05.933593" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:05.934990" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:05.934603" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:05.935513" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:05.935171" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:05.935926" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:05.948628" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:05.935695" elapsed="0.016005">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.952188" elapsed="0.000085"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.952596" 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-07T17:18:05.952952" elapsed="0.000072"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.953341" 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-07T17:18:05.953711" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.954090" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.954693" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.955085" 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-07T17:18:05.955434" elapsed="0.000043"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:05.954419" elapsed="0.001129"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.954244" elapsed="0.001365"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.955909" elapsed="0.000043"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.956070" elapsed="0.000037"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.932115" elapsed="0.024362">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:05.956759" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:05.956856" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:05.931490" elapsed="0.025418"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:05.958487" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.957625" elapsed="0.001005">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:05.957135" elapsed="0.001645">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:05.957091" elapsed="0.001768">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.959000" elapsed="0.000042"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.906741" elapsed="0.052510">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.959690" elapsed="0.000054"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.960115" elapsed="0.000053"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.960330" elapsed="0.000039"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:05.904352" elapsed="0.056223">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.960775" 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-07T17:18:05.960962" elapsed="0.000038"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:05.961155" 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-07T17:18:05.961351" 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-07T17:18:05.961539" 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-07T17:18:05.961709" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:05.961775" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:05.901481" elapsed="0.060401">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:06.992737" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:06.992263" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:06.993262" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:06.992934" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:06.993335" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:18:06.993517" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:06.991793" 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-07T17:18:06.998068" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:06.997865" elapsed="0.000230"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:06.998473" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:06.998241" elapsed="0.000305">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.998706" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.998904" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999075" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999236" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999410" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999568" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999743" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:06.999899" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.009632" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.009842" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.019556" 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-07T17:18:07.019776" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.019841" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:06.997318" elapsed="0.022637">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:07.020084" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:07.020127" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:06.996749" elapsed="0.023401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.020383" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:07.020236" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:07.020216" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:07.021778" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:07.022463" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:07.022155" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:07.023437" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:07.023175" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:07.023509" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:07.023657" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:07.022670" elapsed="0.001011"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:07.024219" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:07.023834" elapsed="0.000411"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:07.024743" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:07.024397" elapsed="0.000372"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:07.025173" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:07.037716" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:07.024925" elapsed="0.015719">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.041080" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.041526" elapsed="0.000062"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.042056" 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-07T17:18:07.042476" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.042853" 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-07T17:18:07.043243" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.043821" 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-07T17:18:07.044224" 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-07T17:18:07.044571" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:07.043547" elapsed="0.001262"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.043393" elapsed="0.001474"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.045202" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.045334" elapsed="0.000057"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:07.021211" elapsed="0.024389">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:07.045859" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:07.046030" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:07.020599" elapsed="0.025496"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:07.047852" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:07.046965" elapsed="0.001076">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:07.046401" elapsed="0.001809">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:07.046353" elapsed="0.001938">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.048409" elapsed="0.000040"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:06.996206" elapsed="0.052468">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.049103" elapsed="0.000051"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.049518" elapsed="0.000049"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.049659" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:06.993838" elapsed="0.056044">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:07.050277" 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-07T17:18:07.050623" 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-07T17:18:07.050787" 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-07T17:18:07.050943" 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-07T17:18:07.051120" 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-07T17:18:07.051277" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:07.051336" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:06.991063" elapsed="0.060370">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:08.081778" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:08.081260" elapsed="0.000551"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:08.082317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:08.081996" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:08.082392" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:08.082571" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:08.080851" 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-07T17:18:08.087578" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:08.087384" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:08.088004" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.087751" elapsed="0.000328">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.088242" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.088445" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.088600" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.088760" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.088936" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.089114" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.089289" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.089444" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.099296" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.099489" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.109113" 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-07T17:18:08.109300" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.109364" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.086807" elapsed="0.022671">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:08.109588" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:08.109631" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:08.086232" elapsed="0.023423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.109854" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:08.109740" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:08.109721" 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-07T17:18:08.111251" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:08.111923" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:08.111609" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:08.112740" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:08.112479" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:08.112851" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:08.113017" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:08.112145" elapsed="0.000898"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:08.113562" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:08.113198" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:08.114100" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:08.113738" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:08.114509" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:08.129932" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:08.114282" elapsed="0.017404">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.131872" 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-07T17:18:08.132060" 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-07T17:18:08.132223" 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-07T17:18:08.132384" 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-07T17:18:08.132550" 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-07T17:18:08.132708" 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-07T17:18:08.132989" 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-07T17:18:08.133156" 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-07T17:18:08.133311" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:08.132850" elapsed="0.000514"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.132778" 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-07T17:18:08.133527" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.133586" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.110677" elapsed="0.023018">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:08.133809" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:08.133852" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:08.110078" elapsed="0.023798"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:08.134501" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.134181" elapsed="0.000379">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:08.133956" elapsed="0.000665">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:08.133938" elapsed="0.000715">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.134698" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.085616" elapsed="0.049179">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.135646" 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-07T17:18:08.135809" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.135871" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:08.082998" elapsed="0.052992">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:08.136157" 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-07T17:18:08.136331" 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-07T17:18:08.136496" 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-07T17:18:08.136655" 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-07T17:18:08.136820" 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-07T17:18:08.137000" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:08.137062" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:08.080137" elapsed="0.057023">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:09.161603" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:09.161155" elapsed="0.000478"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:09.162124" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:09.161795" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:09.162197" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:09.162370" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:09.160748" 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-07T17:18:09.167046" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:09.166836" elapsed="0.000237"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:09.167451" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.167221" elapsed="0.000298">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.167898" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.168121" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.168279" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.168438" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.168675" elapsed="0.000032"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.168865" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.169053" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.169213" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.179037" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.179231" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.189019" 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-07T17:18:09.189211" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.189278" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.166304" elapsed="0.023087">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:09.189504" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:09.189547" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:09.165629" elapsed="0.023941"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.189769" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:09.189655" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:09.189635" 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-07T17:18:09.191144" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:09.191806" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:09.191499" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:09.192622" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:09.192359" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:09.192708" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:09.192855" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:09.192027" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:09.193417" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:09.193051" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:09.193938" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:09.193596" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:09.194365" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:09.205583" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:09.194137" elapsed="0.013209">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.207563" 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-07T17:18:09.207734" 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-07T17:18:09.207901" 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-07T17:18:09.208082" 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-07T17:18:09.208250" 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-07T17:18:09.208409" 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-07T17:18:09.208687" 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-07T17:18:09.208861" 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-07T17:18:09.209033" elapsed="0.000022"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:09.208548" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.208477" 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-07T17:18:09.209251" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.209310" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.190593" elapsed="0.018827">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:09.209533" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:09.209578" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:09.189993" elapsed="0.019609"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:09.210235" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.209895" elapsed="0.000400">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:09.209685" elapsed="0.000672">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:09.209667" elapsed="0.000723">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.210436" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.165088" elapsed="0.045448">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.210710" 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-07T17:18:09.210874" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.210936" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:09.162689" elapsed="0.048367">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:09.211256" 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-07T17:18:09.211434" 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-07T17:18:09.211602" 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-07T17:18:09.211761" 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-07T17:18:09.211931" 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-07T17:18:09.212111" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:09.212173" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:09.160030" elapsed="0.052242">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:10.245150" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:10.244700" elapsed="0.000480"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:10.245652" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:10.245341" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:10.245726" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:18:10.245892" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:10.244323" elapsed="0.001593"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:10.250480" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:10.250294" elapsed="0.000212"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:10.250889" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.250652" elapsed="0.000303">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251131" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251330" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251485" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251644" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251820" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.251995" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.252261" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.252422" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.262321" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.262572" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.272309" 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-07T17:18:10.272500" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.272569" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.249739" elapsed="0.022946">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:10.272798" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:10.272842" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:10.249186" elapsed="0.023679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.273081" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:10.272951" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:10.272932" 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-07T17:18:10.274539" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:10.275246" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:10.274916" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:10.276267" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:10.275794" elapsed="0.000500"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:10.276344" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:10.276496" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:10.275457" elapsed="0.001063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:10.277069" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:10.276679" elapsed="0.000416"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:10.277601" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:10.277256" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:10.278024" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:10.288320" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:10.277783" elapsed="0.013747">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.291937" elapsed="0.000087"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.292357" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.292714" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.293108" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.293550" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.293914" 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-07T17:18:10.294617" 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-07T17:18:10.295045" 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-07T17:18:10.295402" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:10.294336" elapsed="0.001185"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.294177" elapsed="0.001402"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.295881" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.296041" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.273992" elapsed="0.022296">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:10.296542" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:10.296638" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:10.273293" elapsed="0.023397"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:10.298118" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.297380" elapsed="0.000872">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:10.296877" elapsed="0.001514">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:10.296832" elapsed="0.001630">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.298561" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.248628" elapsed="0.050203">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.299079" 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-07T17:18:10.299245" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.299306" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:10.246227" elapsed="0.053177">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:10.299567" 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-07T17:18:10.299741" 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-07T17:18:10.299909" 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-07T17:18:10.300083" 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-07T17:18:10.300245" 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-07T17:18:10.300403" elapsed="0.000061"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:10.300509" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:10.243629" elapsed="0.056989">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:11.331493" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:11.331020" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.332030" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:11.331690" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:11.332106" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:11.332281" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:11.330616" 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-07T17:18:11.337182" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:11.336984" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:11.337586" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.337355" elapsed="0.000302">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.337816" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338030" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338187" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338345" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338520" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338680" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.338852" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.339023" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.348879" elapsed="0.000064"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.349127" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.361319" 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-07T17:18:11.361520" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.361665" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.336417" elapsed="0.025376">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:11.361908" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:11.361952" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.335837" elapsed="0.026152"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.362206" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.362082" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.362061" 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-07T17:18:11.363621" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.364314" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:11.363997" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:11.365155" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:11.364855" elapsed="0.000327"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:11.365229" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:11.365379" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:11.364522" elapsed="0.000882"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.365927" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:11.365561" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.366465" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:11.366122" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:11.366877" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:11.379058" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:11.366647" elapsed="0.014280">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.381204" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.381417" 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-07T17:18:11.381618" 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-07T17:18:11.381813" 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-07T17:18:11.382034" 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-07T17:18:11.382234" 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-07T17:18:11.382569" 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-07T17:18:11.382740" 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-07T17:18:11.382899" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:11.382435" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.382319" elapsed="0.000705"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.383174" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.383238" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.363071" elapsed="0.020419">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:11.383647" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:11.383692" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.362421" elapsed="0.021294"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.384473" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.384075" elapsed="0.000460">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:11.383817" elapsed="0.000782">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:11.383795" elapsed="0.000838">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.384681" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.335288" elapsed="0.049496">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.384991" 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-07T17:18:11.385161" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.385222" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:11.332605" elapsed="0.052720">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.385492" 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-07T17:18:11.385671" 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-07T17:18:11.385836" 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-07T17:18:11.386007" 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-07T17:18:11.386172" 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-07T17:18:11.386331" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.386393" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:11.329864" elapsed="0.056632">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<msg time="2026-04-07T17:18:11.386604" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.638634" elapsed="20.748101">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.386812" elapsed="0.000016"/>
</return>
<var>${original_owner}</var>
<var>${original_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.636573" elapsed="20.750342">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_candidate}</var>
<arg>${original_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.387106" 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-07T17:18:11.387287" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.387454" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:17:50.218925" elapsed="21.168703">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</test>
<test id="s1-s1-s2-t4" name="Create Bridge Manually and Verify Before Fail" line="35">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:11.392017" elapsed="0.000235"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:11.391743" 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-07T17:18:11.393350" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.393229" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.393209" 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-07T17:18:11.398173" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.398066" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.398048" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.399234" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:11.398830" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.399714" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:11.399412" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:11.399783" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:11.399940" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:11.398463" elapsed="0.001501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.405047" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.404924" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.404905" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.406371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.406262" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.406243" elapsed="0.000199"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:11.406954" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:11.406581" elapsed="0.000417"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.407418" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:11.407157" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.437855" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:11.408007" elapsed="0.030110"/>
</kw>
<msg time="2026-04-07T17:18:11.438375" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:11.438444" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.407603" elapsed="0.030960"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.495625" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:11.439488" elapsed="0.056338"/>
</kw>
<msg time="2026-04-07T17:18:11.496024" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:11.496075" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.438823" elapsed="0.057290"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.496427" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.496195" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.496174" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.497097" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:11.496673" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.497469" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.497256" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.497237" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:11.497603" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.499956" elapsed="0.000554"/>
</kw>
<kw name="Open 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-07T17:18:11.501511" elapsed="0.000655"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:11.503101" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:11.498493" elapsed="0.005020"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:11.497881" elapsed="0.005750"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:11.405919" elapsed="0.097814"/>
</kw>
<msg time="2026-04-07T17:18:11.503824" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.503867" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.405259" elapsed="0.098646"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:11.504131" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:11.504005" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.503963" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.504617" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.504993" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.505066" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:11.404575" elapsed="0.100600"/>
</kw>
<msg time="2026-04-07T17:18:11.505267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.505311" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.400345" elapsed="0.105002"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.505666" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.505421" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.505404" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:11.400208" elapsed="0.105608"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.511246" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.511134" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.511114" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.512558" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.512449" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.512431" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:11.513299" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:11.512794" elapsed="0.000532"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.513787" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:11.513480" elapsed="0.000334"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.543675" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:11.514375" elapsed="0.029531"/>
</kw>
<msg time="2026-04-07T17:18:11.544189" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:11.544259" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.513984" elapsed="0.030331"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.620226" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:11.545143" elapsed="0.075286"/>
</kw>
<msg time="2026-04-07T17:18:11.620618" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:11.620664" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.544557" elapsed="0.076143"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.621021" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.620777" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.620757" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.621642" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:11.621264" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.622025" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.621797" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.621779" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:11.622160" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.624475" elapsed="0.000544"/>
</kw>
<kw name="Open 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-07T17:18:11.625941" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:11.627353" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:11.623024" elapsed="0.004729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:11.622434" elapsed="0.005431"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:11.512143" elapsed="0.115821"/>
</kw>
<msg time="2026-04-07T17:18:11.628116" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.628162" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.511469" elapsed="0.116730"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:11.628384" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:11.628277" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.628258" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.628877" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.629410" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.629485" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:11.510753" elapsed="0.118842"/>
</kw>
<msg time="2026-04-07T17:18:11.629687" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.629730" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.506105" elapsed="0.123662"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.630115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.629842" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.629824" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:11.505941" elapsed="0.124277"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.635511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.635404" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.635385" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.636766" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:11.636660" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.636642" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:11.637350" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:11.636994" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.637773" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:11.637528" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.669911" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:11.638348" elapsed="0.031735"/>
</kw>
<msg time="2026-04-07T17:18:11.670250" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:11.670296" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.637952" elapsed="0.032380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.748717" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:11.670875" elapsed="0.078043"/>
</kw>
<msg time="2026-04-07T17:18:11.749114" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:11.749160" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.670494" elapsed="0.078702"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.749508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.749278" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.749256" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.750206" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:11.749792" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.750574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.750362" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.750343" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:11.750707" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.753050" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:18:11.754500" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:11.755906" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:11.751570" elapsed="0.004797"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:11.750989" elapsed="0.005497"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:11.636346" elapsed="0.120240"/>
</kw>
<msg time="2026-04-07T17:18:11.756677" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.756721" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.635723" elapsed="0.121035"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:11.756940" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-07T17:18:11.756835" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.756816" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.757417" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.757740" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:11.757810" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:11.634757" elapsed="0.123157"/>
</kw>
<msg time="2026-04-07T17:18:11.758034" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:11.758081" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.630477" elapsed="0.127641"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:11.758436" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.758194" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.758177" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:11.630342" elapsed="0.128193"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:11.400034" elapsed="0.358533"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:11.397694" elapsed="0.360931"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:11.392915" elapsed="0.365768"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:11.392452" elapsed="0.366278"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:11.388924" elapsed="0.369862"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:18:11.767105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:11.766825" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:11.766807" elapsed="0.000414"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.767507" 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-07T17:18:11.767609" 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-07T17:18:11.767368" elapsed="0.000268"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.768222" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:18:11.767782" elapsed="0.000498"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.768794" level="INFO">${conn_id} = 255</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-07T17:18:11.768432" elapsed="0.000388"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:11.769740" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:11.769818" 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-07T17:18:11.769437" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.770010" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:11.771170" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:12.081775" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:50 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:11.770838" elapsed="0.311083"/>
</kw>
<msg time="2026-04-07T17:18:12.082008" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.770489" elapsed="0.311595"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:11.769045" elapsed="0.313143"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.082625" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:18:12.165333" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:12.165499" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:12.165562" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:12.082402" elapsed="0.083192"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:12.165827" elapsed="0.000586"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.167102" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.166682" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.167456" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.167273" elapsed="0.000250"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.167241" elapsed="0.000315"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:12.167790" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.167629" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.167609" elapsed="0.000297"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.167952" elapsed="0.000040"/>
</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-07T17:18:12.171555" elapsed="0.000482"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.172260" elapsed="0.000212"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:12.172670" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.168416" elapsed="0.004461"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:11.766305" elapsed="0.406719"/>
</kw>
<msg time="2026-04-07T17:18:12.173192" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:11.765646" elapsed="0.407616"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:11.765156" elapsed="0.408214"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.174078" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.173614" elapsed="0.000501"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.174758" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.174354" elapsed="0.000440"/>
</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-07T17:18:12.184722" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:12.184334" elapsed="0.000415"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.185224" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:12.184905" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:12.185294" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.185447" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.183952" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.190727" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.190432" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.190798" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:12.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-07T17:18:12.190092" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.197267" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.197018" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.197701" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.197459" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.207985" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.208129" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.208245" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.199717" elapsed="0.008555"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.197811" elapsed="0.010503"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.208491" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.208341" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.197792" elapsed="0.010784"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.211862" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.209593" elapsed="0.002315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.209379" elapsed="0.002563"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.209361" elapsed="0.002621"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.215288" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.212371" elapsed="0.002979"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.212048" elapsed="0.003349"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.212027" elapsed="0.003404"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.216221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.215661" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.216737" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.216410" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.217516" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.217093" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.216852" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.216383" elapsed="0.001249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.218380" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.217845" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.218828" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.218513" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.219585" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.219176" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.218941" elapsed="0.000743"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.218488" elapsed="0.001226"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.219915" elapsed="0.000495"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.221063" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.220634" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.221327" elapsed="0.003004"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.208932" elapsed="0.015463"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.224570" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.224464" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.224446" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.224797" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.224867" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:12.227141" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.191313" elapsed="0.035856"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.227219" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.227367" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:12.189600" elapsed="0.037792"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.228555" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.228179" elapsed="0.000451"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.228029" elapsed="0.000640"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.227883" elapsed="0.000818"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.227624" elapsed="0.001128"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:12.185671" elapsed="0.043114"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.236220" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.235893" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.236294" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:12.236443" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.235513" elapsed="0.000956"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.242615" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.242367" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.243106" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.242846" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.256064" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.256281" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.256506" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.245115" elapsed="0.011449"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.243218" elapsed="0.013439"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.257080" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.256714" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.243200" elapsed="0.014091"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.264550" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.259565" elapsed="0.005086"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.259065" elapsed="0.005662"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.259023" elapsed="0.005759"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.269129" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.265421" elapsed="0.003752"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.264903" elapsed="0.004304"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.264866" elapsed="0.004365"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.269752" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.269385" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.270089" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.269847" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.270629" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.270333" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.270180" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.269829" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.271242" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.270862" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.271573" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.271337" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.272117" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.271807" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.271656" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.271319" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.272344" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.273129" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.272840" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.273303" elapsed="0.002265"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.258092" elapsed="0.017539"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.275805" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.275700" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.275682" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.276046" elapsed="0.000060"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.276158" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:12.278275" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.236786" elapsed="0.041516"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.278353" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:12.278500" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:12.235022" elapsed="0.043503"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.279682" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.279293" elapsed="0.000453"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.279148" elapsed="0.000639"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.279018" elapsed="0.000798"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.278744" elapsed="0.001122"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:12.228871" elapsed="0.051029"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.285069" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.284756" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.285142" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.285287" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.284422" elapsed="0.000889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.291373" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.291126" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.291943" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.291676" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.309806" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.309907" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.310021" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.294009" elapsed="0.016045"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.292079" elapsed="0.018028"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.310509" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.310159" elapsed="0.000490"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.292059" elapsed="0.018637"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.318296" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.312950" elapsed="0.005451"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.312472" elapsed="0.006006"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.312432" elapsed="0.006100"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.321902" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.319175" elapsed="0.002771"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.318656" elapsed="0.003339"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.318618" elapsed="0.003403"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.322548" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.322181" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.322870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.322643" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.323478" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.323161" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.322951" elapsed="0.000591"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.322625" elapsed="0.000939"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.324096" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.323718" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.324424" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.324198" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.324948" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.324656" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.324505" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.324180" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.325192" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.325960" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.325691" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.326153" elapsed="0.002151"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.311507" elapsed="0.016860"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.328540" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.328436" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.328418" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.328764" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.328833" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:12.330994" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.285627" elapsed="0.045395"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.331074" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.331223" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:12.283933" elapsed="0.047314"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.332594" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.332227" elapsed="0.000430"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.332078" elapsed="0.000619"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.331748" elapsed="0.000978"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.331486" elapsed="0.001291"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:12.280001" elapsed="0.052809"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:12.185528" elapsed="0.147309"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.183381" elapsed="0.149504"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:18:12.175056" elapsed="0.157880"/>
</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-07T17:18:12.342686" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:12.342290" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.343192" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:12.342868" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:12.343358" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:18:12.343553" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.341890" elapsed="0.001689"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.348845" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.348549" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.348916" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.349077" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.348212" elapsed="0.000892"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.355499" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.355227" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.355937" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.355693" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.377625" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.379141" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2407'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.379253" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.357964" elapsed="0.021315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.356071" elapsed="0.023250"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.379513" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.379348" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.356049" elapsed="0.023550"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.382872" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.380583" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.380371" elapsed="0.002656"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.380353" elapsed="0.002700"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.385457" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.383332" elapsed="0.002169"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.383113" elapsed="0.002423"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.383095" elapsed="0.002465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.386117" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.385726" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.386443" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.386214" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.386990" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.386678" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.386524" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.386196" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.387608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.387227" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.387929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.387703" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.388475" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.388182" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.388027" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.387685" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.388699" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.389499" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.389218" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.389672" elapsed="0.002132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.379940" elapsed="0.011927"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.392056" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.391935" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.391917" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.392283" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.392352" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:12.394563" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.349429" elapsed="0.045161"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.394641" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:12.394789" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:12.347719" elapsed="0.047095"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.395982" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.395596" elapsed="0.000466"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.395449" elapsed="0.000652"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.395310" elapsed="0.000821"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.395052" elapsed="0.001130"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:12.343768" elapsed="0.052486"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.401600" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.401303" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.401672" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.401820" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.400949" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.407980" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.407721" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.408417" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.408177" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.423274" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.425619" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2407'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.425866" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.410432" elapsed="0.015492"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.408527" elapsed="0.017519"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.426435" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.426105" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.408508" elapsed="0.018115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.433009" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.428864" elapsed="0.004294"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.428388" elapsed="0.004807"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.428348" elapsed="0.004872"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.435640" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.433499" elapsed="0.002186"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.433279" elapsed="0.002440"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.433262" elapsed="0.002482"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.436288" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.435899" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.436615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.436386" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.437165" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.436849" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.436696" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.436368" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.437761" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.437403" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.438104" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.437856" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.438690" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.438387" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.438186" elapsed="0.000565"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.437838" elapsed="0.000934"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.438915" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.439726" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.439453" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.439899" elapsed="0.002272"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.427425" elapsed="0.014810"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.442406" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.442303" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.442285" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.442628" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.442698" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:12.444999" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.402182" elapsed="0.042846"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.445079" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.445229" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:12.400466" elapsed="0.044789"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.446398" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.446024" elapsed="0.000449"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.445862" elapsed="0.000650"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.445733" elapsed="0.000809"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.445473" elapsed="0.001120"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:12.396346" elapsed="0.050321"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.451924" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.451537" elapsed="0.000420"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:12.452020" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:12.452174" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.451185" elapsed="0.001014"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.458277" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.458030" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.458711" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.458470" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:12.474616" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:12.474795" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2407'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:12.474902" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:12.460714" elapsed="0.014213"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.458821" elapsed="0.016173"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.475270" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.475023" elapsed="0.000393"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.458803" elapsed="0.016661"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.483452" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.477798" elapsed="0.005861"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.477317" elapsed="0.006421"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.477275" elapsed="0.006519"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.486394" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.484282" elapsed="0.002157"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.483918" elapsed="0.002555"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.483881" elapsed="0.002617"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.487042" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.486653" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.487382" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.487141" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.487914" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.487617" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.487464" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.487123" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.488529" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.488169" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.488853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.488625" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.489399" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:12.489103" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:12.488933" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.488607" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.489626" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:12.490414" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:12.490144" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.490586" elapsed="0.002140"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:12.476344" elapsed="0.016444"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:12.492960" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.492857" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.492838" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.493204" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.493273" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:12.495500" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:12.452517" elapsed="0.043011"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:12.495577" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:12.495725" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:12.450690" elapsed="0.045061"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.496900" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:12.496530" elapsed="0.000460"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:12.496383" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:12.496247" elapsed="0.000812"/>
</for>
<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="PASS" start="2026-04-07T17:18:12.495985" elapsed="0.001126"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:12.446758" elapsed="0.050433"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:12.343632" elapsed="0.153591"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.341294" elapsed="0.155980"/>
</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_operational}</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-07T17:18:12.333137" elapsed="0.164190"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:11.763132" elapsed="0.734257"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:11.388178" elapsed="1.109332"/>
</test>
<test id="s1-s1-s2-t5" name="Add Port Manually and Verify Before Fail" line="39">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:12.500768" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:12.500510" 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-07T17:18:12.502027" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.501901" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.501883" 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-07T17:18:12.507108" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.507000" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.506981" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.508207" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:12.507800" elapsed="0.000435"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.508691" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:12.508389" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:12.508761" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:12.508915" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.507419" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.513982" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.513861" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.513843" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.515297" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.515174" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.515156" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:12.515861" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.515502" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.516322" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:12.516057" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.546269" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:12.516879" elapsed="0.029572"/>
</kw>
<msg time="2026-04-07T17:18:12.546619" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:12.546666" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.516501" elapsed="0.030201"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.603887" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:12.547287" elapsed="0.056817"/>
</kw>
<msg time="2026-04-07T17:18:12.604280" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:12.604394" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.546866" elapsed="0.057568"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.604763" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.604523" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.604498" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.605410" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.605021" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.605775" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.605565" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.605546" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:12.605907" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.608287" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:18:12.609707" elapsed="0.000656"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:12.611300" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.606808" elapsed="0.004890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:12.606214" elapsed="0.005598"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:12.514849" elapsed="0.097063"/>
</kw>
<msg time="2026-04-07T17:18:12.612020" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.612065" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.514198" elapsed="0.097912"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:12.612294" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.612188" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.612169" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.612766" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.613132" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.613204" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:12.513530" elapsed="0.099782"/>
</kw>
<msg time="2026-04-07T17:18:12.613402" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.613446" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.509319" elapsed="0.104163"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.613802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.613557" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.613540" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:12.509182" elapsed="0.104720"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.619077" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.618945" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.618926" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.620318" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.620210" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.620193" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:12.620926" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.620566" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.621412" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:12.621161" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.661511" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:12.622013" elapsed="0.039706"/>
</kw>
<msg time="2026-04-07T17:18:12.661902" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:12.661949" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.621593" elapsed="0.040466"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.726651" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:12.662642" elapsed="0.064204"/>
</kw>
<msg time="2026-04-07T17:18:12.727061" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:12.727114" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.662249" elapsed="0.064903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.727455" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.727231" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.727211" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.728087" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.727696" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.728450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.728240" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.728222" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:12.728581" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.730852" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.732331" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:12.733735" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.729415" elapsed="0.004728"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:12.728830" elapsed="0.005428"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:12.619896" elapsed="0.114461"/>
</kw>
<msg time="2026-04-07T17:18:12.734448" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.734492" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.619291" elapsed="0.115238"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:12.734711" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.734604" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.734586" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.735213" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.735783" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.735857" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:12.618608" elapsed="0.117383"/>
</kw>
<msg time="2026-04-07T17:18:12.736088" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.736131" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.614181" elapsed="0.121986"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.736485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.736241" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.736224" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:12.614044" elapsed="0.122542"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.741604" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.741496" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.741478" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.743052" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:12.742929" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.742912" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:12.743665" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:12.743268" elapsed="0.000442"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.744145" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:12.743864" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.776998" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:12.744703" elapsed="0.032482"/>
</kw>
<msg time="2026-04-07T17:18:12.777358" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:12.777404" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.744326" elapsed="0.033114"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.836736" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:12.778030" elapsed="0.058916"/>
</kw>
<msg time="2026-04-07T17:18:12.837151" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:12.837197" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.777615" elapsed="0.059618"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.837554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.837319" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.837298" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.838195" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:12.837795" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.838555" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.838346" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.838328" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:12.838686" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.841111" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:18:12.842547" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:12.843948" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:12.839633" elapsed="0.004733"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:12.839047" elapsed="0.005430"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:12.742621" elapsed="0.101957"/>
</kw>
<msg time="2026-04-07T17:18:12.844669" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.844712" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.741816" elapsed="0.102933"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:12.844931" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:12.844825" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.844807" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.845439" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.845765" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:12.845835" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:12.741160" elapsed="0.104781"/>
</kw>
<msg time="2026-04-07T17:18:12.846052" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:12.846095" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.736839" elapsed="0.109292"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:12.846447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.846206" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.846189" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:12.736704" elapsed="0.109844"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:12.509010" elapsed="0.337568"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:12.506607" elapsed="0.340029"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:12.501617" elapsed="0.345078"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:12.501196" elapsed="0.345556"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:12.498521" elapsed="0.348288"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:18:12.855136" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:12.854856" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:12.854837" elapsed="0.000381"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.855504" 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-07T17:18:12.855604" 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-07T17:18:12.855363" elapsed="0.000267"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.856175" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:18:12.855776" elapsed="0.000489"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.856794" level="INFO">${conn_id} = 260</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-07T17:18:12.856421" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:12.857726" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:12.857802" 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-07T17:18:12.857436" elapsed="0.000390"/>
</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-07T17:18:12.857991" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:12.859160" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:13.179411" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:12 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:12.858832" elapsed="0.320697"/>
</kw>
<msg time="2026-04-07T17:18:13.179598" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.858471" elapsed="0.321191"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:12.857049" elapsed="0.322712"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.180212" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:18:13.233054" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:13.233320" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:13.233419" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:13.179989" elapsed="0.053483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:13.233825" elapsed="0.000852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.235758" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.235121" elapsed="0.000739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.236342" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.236060" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.236007" elapsed="0.000490"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:13.236836" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.236612" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.236579" elapsed="0.000470"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.237123" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.243019" elapsed="0.000434"/>
</kw>
<kw name="Open 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-07T17:18:13.243611" elapsed="0.000156"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:13.243909" elapsed="0.000123"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.237827" elapsed="0.006256"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:12.854264" elapsed="0.389908"/>
</kw>
<msg time="2026-04-07T17:18:13.244224" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:12.853695" elapsed="0.390577"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:12.853195" elapsed="0.391210"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.244901" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.244583" elapsed="0.000344"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.245404" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.245115" elapsed="0.000315"/>
</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-07T17:18:13.254930" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:13.254555" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.255441" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:13.255140" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:13.255509" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.255660" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.254166" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.260907" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.260613" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.260991" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:13.261138" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.260277" elapsed="0.000885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.268985" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.268721" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.269430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.269183" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.278458" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.278595" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.278698" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.271458" elapsed="0.007267"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.269542" elapsed="0.009225"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.278944" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.278794" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.269523" elapsed="0.009525"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.283619" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.280447" elapsed="0.003238"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.280148" elapsed="0.003586"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.280121" elapsed="0.003648"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.287153" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.284169" elapsed="0.003062"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.283847" elapsed="0.003442"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.283823" elapsed="0.003501"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.287870" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.287488" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.288224" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.287965" elapsed="0.000354"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.288802" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.288503" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.288346" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.287947" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.289416" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.289051" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.289736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.289511" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.290294" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.289982" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.289816" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.289493" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.290522" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.291339" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.291041" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.291514" elapsed="0.002144"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.279533" elapsed="0.014189"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.293899" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.293792" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.293774" elapsed="0.000225"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.294162" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.294233" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:13.296357" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.261490" elapsed="0.034894"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.296435" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.296584" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:13.259786" elapsed="0.036823"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.297762" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.297384" elapsed="0.000444"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.297237" elapsed="0.000632"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.297105" elapsed="0.000793"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.296828" elapsed="0.001123"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:13.255885" elapsed="0.042115"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.303344" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.303043" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.303416" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.303562" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.302686" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.309725" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.309480" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.310193" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.309917" elapsed="0.000319"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.324411" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.324637" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.324842" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.312226" elapsed="0.012674"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.310303" elapsed="0.014723"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.325420" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.325087" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.310285" elapsed="0.015325"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.332794" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.327865" elapsed="0.005031"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.327392" elapsed="0.005611"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.327351" elapsed="0.005713"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.336732" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.333664" elapsed="0.003113"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.333188" elapsed="0.003623"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.333150" elapsed="0.003685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.337370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.337003" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.337694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.337467" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.338254" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.337929" elapsed="0.000352"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.337775" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.337449" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.338845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.338489" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.339184" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.338940" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.339707" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.339418" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.339264" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.338922" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.339929" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.340708" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.340442" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.340879" elapsed="0.002278"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.326428" elapsed="0.016792"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.343393" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.343289" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.343270" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.343618" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.343687" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:13.345808" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.303912" elapsed="0.041957"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.345923" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.346110" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:13.302200" elapsed="0.043937"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.347358" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.346964" elapsed="0.000458"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.346815" elapsed="0.000648"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.346685" elapsed="0.000807"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.346408" elapsed="0.001137"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:13.298089" elapsed="0.049490"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.352709" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.352414" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.352780" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.352925" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.352071" elapsed="0.000879"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.359069" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.358806" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.359501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.359263" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.373093" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.373209" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.373425" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.361507" elapsed="0.011975"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.359610" elapsed="0.013967"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.373964" elapsed="0.000101"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.373635" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.359592" elapsed="0.014617"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.382097" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.376432" elapsed="0.005779"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.375924" elapsed="0.006367"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.375883" elapsed="0.006467"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.385329" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.383016" elapsed="0.002357"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.382480" elapsed="0.002927"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.382440" elapsed="0.002992"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.385986" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.385593" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.386325" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.386096" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.386862" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.386562" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.386406" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.386077" elapsed="0.000932"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.387536" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.387170" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.387859" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.387633" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.388407" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.388111" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.387940" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.387614" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.388637" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.389445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.389166" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.389620" elapsed="0.002115"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.374961" elapsed="0.016839"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.391988" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.391869" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.391850" elapsed="0.000227"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.392218" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.392289" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:13.394422" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.353281" elapsed="0.041169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.394500" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.394650" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:13.351575" elapsed="0.043100"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.395835" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.395467" elapsed="0.000432"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.395319" elapsed="0.000619"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.395185" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.394899" elapsed="0.001136"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:13.347665" elapsed="0.048404"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:13.255741" elapsed="0.140355"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.253594" elapsed="0.142550"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:18:13.245607" elapsed="0.150590"/>
</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-07T17:18:13.405727" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:13.405353" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.406252" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:13.405907" elapsed="0.000370"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:13.406321" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.406473" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.404986" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.411920" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.411626" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.412009" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:13.412159" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.411287" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.418295" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.418043" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.418730" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.418489" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.429387" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.431639" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2678'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.431796" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.420715" elapsed="0.011116"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.418840" elapsed="0.013050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.432154" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.431927" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.418822" elapsed="0.013453"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.436843" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.433647" elapsed="0.003346"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.433349" elapsed="0.003694"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.433324" elapsed="0.003754"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.440424" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.437459" elapsed="0.003028"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.437157" elapsed="0.003378"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.437133" elapsed="0.003436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.441315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.440782" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.441767" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.441450" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.442537" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.442123" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.441879" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.441424" elapsed="0.001229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.443387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.442864" elapsed="0.000559"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.443830" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.443520" elapsed="0.000389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.444579" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.444176" elapsed="0.000438"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.443942" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.443495" elapsed="0.001197"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.444889" elapsed="0.000497"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.446014" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.445604" elapsed="0.000446"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.446256" elapsed="0.003131"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.432746" elapsed="0.016728"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.449714" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.449570" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.449544" elapsed="0.000287"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.450075" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.450191" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:13.452456" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.412503" elapsed="0.039980"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.452533" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:13.452679" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:13.410792" elapsed="0.041913"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.453836" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.453468" elapsed="0.000445"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.453323" elapsed="0.000640"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.453195" elapsed="0.000812"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.452922" elapsed="0.001137"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:13.406718" elapsed="0.047412"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.459287" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.458983" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.459358" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.459504" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.458632" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.465589" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.465346" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.466045" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.465780" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.481436" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.482140" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2678'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.482296" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.468035" elapsed="0.014297"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.466155" elapsed="0.016236"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.482631" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.482426" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.466136" elapsed="0.016617"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.487553" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.484150" elapsed="0.003538"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.483832" elapsed="0.003906"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.483807" elapsed="0.003965"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.490938" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.488179" elapsed="0.002818"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.487848" elapsed="0.003185"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.487825" elapsed="0.003232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.491579" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.491212" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.491903" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.491675" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.492451" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.492157" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.492000" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.491657" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.493062" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.492685" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.493383" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.493158" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.493916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.493616" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.493464" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.493140" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.494158" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.494922" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.494656" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.495113" elapsed="0.002085"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.483251" elapsed="0.014009"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.497431" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.497328" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.497309" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.497655" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.497725" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:13.499941" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.459846" elapsed="0.040136"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.500034" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.500184" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:13.458156" elapsed="0.042054"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.501347" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.500963" elapsed="0.000460"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.500817" elapsed="0.000645"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.500687" elapsed="0.000804"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.500429" elapsed="0.001114"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:13.454221" elapsed="0.047389"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.506886" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.506592" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:13.506958" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:13.507121" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.506255" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.513366" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.513118" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.513801" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.513561" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:13.529580" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:13.529868" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2678'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:13.530049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:13.515819" elapsed="0.014267"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.513934" elapsed="0.016213"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.530391" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.530183" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.513914" elapsed="0.016595"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.535142" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"47024789-4882-4a4f-8c31-1f68f5ff48c0","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"8a8a3d22-1815-4b35-81e7-648240e9c573","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"2b756466-ae82-4f65-9876-b09b7603db99","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"8a:47:02:47:4f:4a","ovsdb:ofport":65534,"ovsdb:ifindex":8},{"tp-id":"vx1","ovsdb:port-uuid":"6f702c18-b954-489f-b459-064c4066731a","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a4cc5c29-021f-4fa7-b2a1-228be9d838be","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:8a:47:02:47:4f:4a"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.531881" elapsed="0.003412"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.531581" elapsed="0.003762"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.531557" elapsed="0.003821"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.538706" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.535758" elapsed="0.003011"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.535455" elapsed="0.003362"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.535431" elapsed="0.003420"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.539593" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.539085" elapsed="0.000546"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.540066" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.539727" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.540803" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.540393" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.540180" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.539702" elapsed="0.001214"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.541646" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.541149" elapsed="0.000533"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.542127" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.541777" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.542859" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:13.542454" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:13.542240" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.541753" elapsed="0.001240"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.543194" elapsed="0.000475"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:13.544285" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:13.543887" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.544526" elapsed="0.002672"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:13.531002" elapsed="0.016257"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:13.547430" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.547326" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.547308" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.547655" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.547723" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:13.549931" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:13.507464" elapsed="0.042495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:13.550024" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.550176" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:13.505743" elapsed="0.044462"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.551339" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:13.550956" elapsed="0.000459"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:13.550811" elapsed="0.000642"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:13.550683" elapsed="0.000799"/>
</for>
<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="PASS" start="2026-04-07T17:18:13.550424" elapsed="0.001107"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:13.501701" elapsed="0.049898"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:13.406583" elapsed="0.145047"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.404412" elapsed="0.147269"/>
</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_operational}</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-07T17:18:13.396384" elapsed="0.155348"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:12.851088" elapsed="0.700707"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:12.497915" elapsed="1.053993"/>
</test>
<test id="s1-s1-s2-t6" name="Delete the Bridge Manually and Verify Before Fail" line="43">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:13.555341" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:13.555080" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.556580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.556473" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.556455" 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-07T17:18:13.561549" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.561291" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.561271" elapsed="0.000359"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.562722" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:13.562342" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.563222" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:13.562903" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:13.563292" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:13.563443" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.561902" elapsed="0.001566"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.568472" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.568363" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.568345" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.569767" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.569662" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.569644" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:13.570386" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.570020" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.570818" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:13.570567" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.600241" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:13.571395" elapsed="0.029030"/>
</kw>
<msg time="2026-04-07T17:18:13.600603" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:13.600650" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.571014" elapsed="0.029672"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.665734" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:13.601470" elapsed="0.064462"/>
</kw>
<msg time="2026-04-07T17:18:13.666182" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:13.666230" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.600861" elapsed="0.065406"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.666582" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.666351" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.666328" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.667223" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.666824" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.667591" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.667379" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.667361" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:13.667724" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.670176" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.671604" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:13.673021" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.668600" elapsed="0.004820"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:13.668016" elapsed="0.005517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:13.569361" elapsed="0.104271"/>
</kw>
<msg time="2026-04-07T17:18:13.673748" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.673792" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.568686" elapsed="0.105143"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:13.674026" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.673905" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.673886" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.674500" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.674825" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.674895" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:13.568033" elapsed="0.106998"/>
</kw>
<msg time="2026-04-07T17:18:13.675123" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.675167" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.563816" elapsed="0.111387"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.675517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.675277" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.675260" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:13.563679" elapsed="0.111936"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.680750" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.680644" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.680626" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.682072" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.681948" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.681931" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:13.682641" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.682279" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.683178" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:13.682820" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.717202" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:13.683742" elapsed="0.033635"/>
</kw>
<msg time="2026-04-07T17:18:13.717542" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:13.717589" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.683363" elapsed="0.034282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.788245" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:13.718221" elapsed="0.070224"/>
</kw>
<msg time="2026-04-07T17:18:13.788613" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:13.788657" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.717812" elapsed="0.070882"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.789016" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.788772" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.788752" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.789642" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.789255" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.790023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.789796" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.789778" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:13.790155" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.792637" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:18:13.794135" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:13.795560" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.791189" elapsed="0.004772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:13.790418" elapsed="0.005690"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:13.681581" elapsed="0.114629"/>
</kw>
<msg time="2026-04-07T17:18:13.796309" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.796353" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.680959" elapsed="0.115432"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:13.796576" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.796468" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.796449" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.797074" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.797457" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.797544" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:13.680308" elapsed="0.117343"/>
</kw>
<msg time="2026-04-07T17:18:13.797741" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.797783" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.675873" elapsed="0.121946"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.798153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.797893" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.797876" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:13.675738" elapsed="0.122515"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.803444" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.803337" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.803319" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.804733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:13.804627" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.804610" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:13.805315" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:13.804937" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.805765" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:13.805517" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.837227" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:13.806341" elapsed="0.031044"/>
</kw>
<msg time="2026-04-07T17:18:13.837573" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:13.837618" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.805942" elapsed="0.031713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.902203" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:13.838220" elapsed="0.064184"/>
</kw>
<msg time="2026-04-07T17:18:13.902572" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:13.902618" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.837817" elapsed="0.064839"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.902952" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.902732" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.902712" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.903619" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:13.903219" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.904010" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.903773" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.903756" elapsed="0.000387"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:13.904177" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.906484" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:18:13.907992" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:13.909418" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:13.905028" elapsed="0.004783"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:13.904438" elapsed="0.005485"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:13.804331" elapsed="0.105704"/>
</kw>
<msg time="2026-04-07T17:18:13.910126" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.910170" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.803656" elapsed="0.106551"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:13.910392" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:13.910287" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.910266" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.910851" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.911388" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:13.911464" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:13.802994" elapsed="0.108576"/>
</kw>
<msg time="2026-04-07T17:18:13.911660" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:13.911702" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.798517" elapsed="0.113222"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:13.912081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.911812" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.911795" elapsed="0.000364"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:13.798380" elapsed="0.113802"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:13.563517" elapsed="0.348695"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:13.560840" elapsed="0.351427"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:13.556190" elapsed="0.356133"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:13.555751" elapsed="0.356618"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:13.552886" elapsed="0.359538"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:18:13.920334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:13.920077" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:13.920059" elapsed="0.000355"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.920698" 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-07T17:18:13.920798" 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-07T17:18:13.920559" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.921414" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:18:13.921024" elapsed="0.000435"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.921991" level="INFO">${conn_id} = 265</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-07T17:18:13.921610" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:13.922895" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:13.922984" 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-07T17:18:13.922615" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.923164" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:13.924351" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:14.248719" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:17:15 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:13 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:13.924035" elapsed="0.324840"/>
</kw>
<msg time="2026-04-07T17:18:14.248995" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.923657" elapsed="0.325425"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:13.922227" elapsed="0.326966"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.249709" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:18:14.364633" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:14.364759" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:14.364814" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:14.249451" elapsed="0.115387"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:14.365028" elapsed="0.000234"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.365771" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.365464" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.366064" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.365899" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.365871" elapsed="0.000269"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:14.366296" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.366193" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.366179" elapsed="0.000199"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.366412" 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-07T17:18:14.369001" elapsed="0.000320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.369479" elapsed="0.000154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:14.369778" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.366728" elapsed="0.003196"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:13.919544" elapsed="0.450486"/>
</kw>
<msg time="2026-04-07T17:18:14.370084" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:13.919008" elapsed="0.451123"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:13.918508" elapsed="0.451792"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.370794" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.370480" elapsed="0.000340"/>
</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-07T17:18:14.376737" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:14.376359" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.377250" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:14.376932" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:14.377320" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:14.377472" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:14.375986" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.382996" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.382679" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:14.383071" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:14.383217" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.382341" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.389598" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.389350" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.390050" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.389791" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:14.399549" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:14.400515" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:14.400631" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:14.392064" elapsed="0.008592"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.390161" elapsed="0.010537"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.400890" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.400725" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.390142" elapsed="0.010850"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.404235" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.401997" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.401767" elapsed="0.002593"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.401748" elapsed="0.002637"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.406799" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.404656" elapsed="0.002188"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.404441" elapsed="0.002438"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.404424" elapsed="0.002479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.407454" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.407074" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.407780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.407550" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.408332" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.408035" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.407862" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.407532" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.408939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.408570" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.409286" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.409059" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.409809" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.409519" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.409366" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.409041" elapsed="0.000849"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.410051" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:14.410844" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.410553" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.411042" elapsed="0.002362"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:14.401347" elapsed="0.012123"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:14.413652" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.413541" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.413522" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.413880" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.413949" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:14.416144" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:14.383572" elapsed="0.032600"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:14.416223" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:14.416370" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:14.381837" elapsed="0.034559"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.417577" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:14.417196" elapsed="0.000450"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:14.417049" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:14.416901" elapsed="0.000815"/>
</for>
<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="PASS" start="2026-04-07T17:18:14.416614" elapsed="0.001155"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:14.377697" elapsed="0.040141"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.423427" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.423124" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:14.423502" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:14.423649" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.422766" elapsed="0.000908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.429821" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.429573" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.430273" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.430030" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:14.444728" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:14.445044" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:14.445239" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:14.432283" elapsed="0.013012"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.430384" elapsed="0.015004"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.445600" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.445443" elapsed="0.000221"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.430365" elapsed="0.015320"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.448979" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.446685" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.446468" elapsed="0.002604"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.446450" elapsed="0.002646"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.451490" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.449372" elapsed="0.002163"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.449151" elapsed="0.002418"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.449135" elapsed="0.002458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.452142" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.451751" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.452466" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.452238" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.453088" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.452769" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.452589" elapsed="0.000561"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.452220" elapsed="0.000952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.453682" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.453322" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.454017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.453778" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.454548" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.454253" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.454099" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.453760" elapsed="0.000871"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.454774" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:14.455573" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.455293" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.455750" elapsed="0.002293"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:14.446046" elapsed="0.012060"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:14.458279" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.458175" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.458157" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.458508" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.458584" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:14.460757" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:14.424017" elapsed="0.036768"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:14.460836" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:14.461000" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:14.422244" elapsed="0.038783"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.462192" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:14.461800" elapsed="0.000462"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:14.461652" elapsed="0.000650"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:14.461517" elapsed="0.000816"/>
</for>
<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="PASS" start="2026-04-07T17:18:14.461249" elapsed="0.001137"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:14.417930" elapsed="0.044490"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.467607" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.467313" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:14.467677" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:14.467822" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.466959" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.473963" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.473718" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.474414" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.474171" elapsed="0.000327"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:14.487315" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:14.487464" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:14.487565" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:14.476468" elapsed="0.011123"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.474568" elapsed="0.013065"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.487806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.487658" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.474549" elapsed="0.013342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.491318" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.488904" elapsed="0.002470"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.488688" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.488656" elapsed="0.002777"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.493827" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.491703" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.491489" elapsed="0.002417"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.491472" elapsed="0.002458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.494463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.494098" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.494788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.494560" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.495337" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.495040" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.494869" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.494542" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.495935" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.495574" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.496275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.496047" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.496869" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:14.496547" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:14.496389" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.496028" elapsed="0.000925"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.497118" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:14.497892" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:14.497622" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.498082" elapsed="0.002099"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:14.488253" elapsed="0.011990"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:14.500415" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.500312" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.500294" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.500638" elapsed="0.000034"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.500721" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:14.502885" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:14.468180" elapsed="0.034733"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:14.502963" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:14.503128" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:14.466482" elapsed="0.036671"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.504289" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:14.503903" elapsed="0.000453"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:14.503756" elapsed="0.000640"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:14.503629" elapsed="0.000795"/>
</for>
<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="PASS" start="2026-04-07T17:18:14.503371" elapsed="0.001103"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:14.462507" elapsed="0.042001"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:14.377553" elapsed="0.126982"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:18:14.375407" elapsed="0.129176"/>
</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-07T17:18:14.371012" elapsed="0.133624"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:13.916413" elapsed="0.588299"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:13.552279" elapsed="0.952551"/>
</test>
<test id="s1-s1-s2-t7" name="Create Bridge In Owner and Verify Before Fail" line="47">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:14.507834" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:14.507578" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.509113" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.509004" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.508985" 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-07T17:18:14.513840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.513734" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.513716" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.514925" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:14.514512" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.515479" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:14.515172" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:14.515549" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:14.515699" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:14.514144" elapsed="0.001580"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.520744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.520615" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.520596" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.522064" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.521932" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.521915" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:14.522628" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.522270" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.523073" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:14.522808" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.554656" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:14.523632" elapsed="0.031189"/>
</kw>
<msg time="2026-04-07T17:18:14.555012" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:14.555060" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.523253" elapsed="0.031844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.621761" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:14.555652" elapsed="0.066341"/>
</kw>
<msg time="2026-04-07T17:18:14.622180" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:14.622228" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.555264" elapsed="0.067001"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.622575" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.622350" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.622329" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.623223" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.622815" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.623590" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.623379" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.623361" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:14.623722" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.626100" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.627556" elapsed="0.000690"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:14.629253" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.624598" elapsed="0.005065"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:14.623992" elapsed="0.005785"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:14.521631" elapsed="0.108248"/>
</kw>
<msg time="2026-04-07T17:18:14.629989" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.630036" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.520959" elapsed="0.109114"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:14.630267" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.630154" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.630134" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.630746" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.631092" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.631164" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:14.520285" elapsed="0.110985"/>
</kw>
<msg time="2026-04-07T17:18:14.631365" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.631407" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.516086" elapsed="0.115357"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.631758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.631516" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.631500" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:14.515936" elapsed="0.115923"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.637150" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.636941" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.636922" elapsed="0.000296"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.638405" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.638294" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.638276" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:14.638983" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.638611" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.639412" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:14.639164" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.670554" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:14.639984" elapsed="0.030750"/>
</kw>
<msg time="2026-04-07T17:18:14.670901" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:14.670947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.639589" elapsed="0.031427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.743865" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:14.671563" elapsed="0.072517"/>
</kw>
<msg time="2026-04-07T17:18:14.744283" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:14.744330" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.671182" elapsed="0.073206"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.744686" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.744467" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.744447" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.745310" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.744923" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.745670" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.745463" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.745445" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:14.745802" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.748084" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.749509" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:14.750860" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.746645" elapsed="0.004618"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:14.746074" elapsed="0.005302"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:14.637993" elapsed="0.113482"/>
</kw>
<msg time="2026-04-07T17:18:14.751567" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.751610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.637363" elapsed="0.114283"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:14.751828" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.751722" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.751703" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.752303" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.752815" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.752889" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:14.636600" elapsed="0.116431"/>
</kw>
<msg time="2026-04-07T17:18:14.753126" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.753169" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.632133" elapsed="0.121073"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.753522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.753280" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.753263" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:14.631996" elapsed="0.121624"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.758750" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.758644" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.758626" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.760041" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.759881" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.759864" elapsed="0.000248"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:14.760618" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.760253" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.761089" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:14.760797" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.794213" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:14.761648" elapsed="0.032809"/>
</kw>
<msg time="2026-04-07T17:18:14.794692" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:14.794741" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.761271" elapsed="0.033509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.870518" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:14.795528" elapsed="0.075204"/>
</kw>
<msg time="2026-04-07T17:18:14.870906" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:14.870952" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.795038" elapsed="0.075977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.871363" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.871113" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.871085" elapsed="0.000380"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.871999" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:14.871604" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.872392" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.872158" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.872140" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:14.872530" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:14.875009" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:18:14.876496" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:14.877932" elapsed="0.000344"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:14.873464" elapsed="0.004883"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:14.872837" elapsed="0.005626"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:14.759585" elapsed="0.118979"/>
</kw>
<msg time="2026-04-07T17:18:14.878659" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.878713" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.758959" elapsed="0.119791"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:14.878937" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-07T17:18:14.878829" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.878809" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.879447" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.879863" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.879935" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:14.758305" elapsed="0.121755"/>
</kw>
<msg time="2026-04-07T17:18:14.880158" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:14.880221" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.753870" elapsed="0.126391"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:14.880588" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:14.880340" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.880322" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:14.753739" elapsed="0.126948"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:14.515774" elapsed="0.364948"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:14.513373" elapsed="0.367414"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:14.508705" elapsed="0.372145"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.508261" elapsed="0.372639"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:14.505608" elapsed="0.375351"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:14.893040" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:14.889351" elapsed="0.003730">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:14.505058" elapsed="0.388179">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t8" name="Create Port In Owner and Verify Before Fail" line="51">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:14.896413" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:14.896143" 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-07T17:18:14.897810" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.897699" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.897681" 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-07T17:18:14.902499" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.902371" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.902349" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.903554" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:14.903173" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:14.904050" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:14.903734" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:14.904118" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:14.904286" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:14.902787" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.909483" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.909377" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.909359" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:14.910724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:14.910618" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:14.910601" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:14.911311" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:14.910928" elapsed="0.000449"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.911803" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:14.911536" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:14.942227" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:14.912409" elapsed="0.029991"/>
</kw>
<msg time="2026-04-07T17:18:14.942571" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:14.942617" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.912000" elapsed="0.030653"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.009267" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:14.943234" elapsed="0.066224"/>
</kw>
<msg time="2026-04-07T17:18:15.009625" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.009670" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.942820" elapsed="0.066886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.010025" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.009785" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.009763" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.010629" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.010263" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.011008" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.010779" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.010761" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.011141" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.013404" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.014813" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.016219" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.011962" elapsed="0.004644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.011393" elapsed="0.005325"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:14.910321" elapsed="0.106496"/>
</kw>
<msg time="2026-04-07T17:18:15.016906" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.016949" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.909695" elapsed="0.107305"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.017185" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.017078" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.017059" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.017650" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.017983" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.018093" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:14.909046" elapsed="0.109156"/>
</kw>
<msg time="2026-04-07T17:18:15.018293" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.018342" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.904686" elapsed="0.113692"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.018694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.018451" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.018434" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:14.904550" elapsed="0.114243"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.024225" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.023913" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.023895" elapsed="0.000398"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.025464" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.025359" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.025341" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.026033" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.025669" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.026453" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.026210" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.059945" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.027074" elapsed="0.033116"/>
</kw>
<msg time="2026-04-07T17:18:15.060357" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.060402" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.026632" elapsed="0.033806"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.125236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.061005" elapsed="0.064437"/>
</kw>
<msg time="2026-04-07T17:18:15.125609" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.125655" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.060605" elapsed="0.065086"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.126014" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.125769" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.125749" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.126620" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.126252" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.126996" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.126771" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.126753" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.127128" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.129438" elapsed="0.000569"/>
</kw>
<kw name="Open 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-07T17:18:15.130916" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.132329" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.127996" elapsed="0.004722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.127382" elapsed="0.005448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.025059" elapsed="0.107870"/>
</kw>
<msg time="2026-04-07T17:18:15.133035" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.133080" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.024439" elapsed="0.108678"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.133298" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.133194" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.133175" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.133757" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.134093" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.134165" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.023577" elapsed="0.110693"/>
</kw>
<msg time="2026-04-07T17:18:15.134362" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.134405" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.019075" elapsed="0.115366"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.134756" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.134515" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.134498" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:15.018911" elapsed="0.115945"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.140081" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.139896" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.139878" elapsed="0.000283"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.141382" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.141271" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.141254" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.141936" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.141585" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.142380" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.142130" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.171815" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.142937" elapsed="0.029142"/>
</kw>
<msg time="2026-04-07T17:18:15.172250" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.172295" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.142557" elapsed="0.029774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.230629" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.172877" elapsed="0.058076"/>
</kw>
<msg time="2026-04-07T17:18:15.231189" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.231238" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.172495" elapsed="0.058782"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.231675" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.231385" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.231350" elapsed="0.000432"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.232390" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.231937" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.232758" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.232546" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.232527" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.232894" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.235341" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:18:15.236827" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.238264" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.233819" elapsed="0.004843"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.233211" elapsed="0.005569"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.140956" elapsed="0.097925"/>
</kw>
<msg time="2026-04-07T17:18:15.238991" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.239038" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.140341" elapsed="0.098734"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.239262" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.239154" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.239135" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.239749" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.240148" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.240220" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.139563" elapsed="0.100766"/>
</kw>
<msg time="2026-04-07T17:18:15.240432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.240476" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.135128" elapsed="0.105390"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.240840" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.240596" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.240579" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:15.134989" elapsed="0.105951"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:14.904369" elapsed="0.336622"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:14.901995" elapsed="0.339062"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:14.897399" elapsed="0.343757"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:14.896815" elapsed="0.344392"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:14.894014" elapsed="0.347251"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:15.254762" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.251045" elapsed="0.003756">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:14.893458" elapsed="0.361501">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t9" name="Modify the destination IP of Port In Owner Before Fail" 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-07T17:18:15.258209" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:15.257929" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.259481" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.259366" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.259346" elapsed="0.000203"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.264092" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.263985" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.263953" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.265152" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:15.264750" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.265638" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:15.265332" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:15.265706" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:15.265858" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:15.264382" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.271058" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.270935" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.270917" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.272334" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.272228" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.272210" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.272896" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.272541" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.273342" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.273093" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.306045" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.273894" elapsed="0.032312"/>
</kw>
<msg time="2026-04-07T17:18:15.306375" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.306422" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.273519" elapsed="0.032939"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.376083" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.307023" elapsed="0.069257"/>
</kw>
<msg time="2026-04-07T17:18:15.376492" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.376538" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.306623" elapsed="0.069951"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.376867" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.376651" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.376631" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.377503" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.377134" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.377869" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.377660" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.377642" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.378018" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.380332" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:18:15.381778" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.383174" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.378845" elapsed="0.004714"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.378279" elapsed="0.005408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.271908" elapsed="0.111878"/>
</kw>
<msg time="2026-04-07T17:18:15.383876" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.383919" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.271270" elapsed="0.112685"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.384155" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.384048" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.384029" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.384622" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.384944" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.385032" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.270602" elapsed="0.114537"/>
</kw>
<msg time="2026-04-07T17:18:15.385230" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.385272" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.266271" elapsed="0.119037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.385620" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.385381" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.385365" elapsed="0.000331"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:15.266133" elapsed="0.119585"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.390858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.390752" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.390734" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.392195" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.392088" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.392071" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.392751" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.392399" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.393188" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.392928" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.423410" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.393745" elapsed="0.029840"/>
</kw>
<msg time="2026-04-07T17:18:15.423768" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.423814" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.393368" elapsed="0.030482"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.493523" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.424414" elapsed="0.069324"/>
</kw>
<msg time="2026-04-07T17:18:15.493916" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.493962" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.424031" elapsed="0.069989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.494356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.494105" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.494082" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.494999" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.494598" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.495367" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.495159" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.495141" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.495500" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.497842" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:18:15.499420" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.500888" elapsed="0.000342"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.496386" elapsed="0.004913"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.495786" elapsed="0.005628"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.391730" elapsed="0.109784"/>
</kw>
<msg time="2026-04-07T17:18:15.501606" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.501651" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.391093" elapsed="0.110595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.501869" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.501763" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.501745" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.502353" elapsed="0.000066"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.502729" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.502800" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.390421" elapsed="0.112487"/>
</kw>
<msg time="2026-04-07T17:18:15.503030" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.503075" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.385984" elapsed="0.117128"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.503432" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.503188" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.503171" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:15.385837" elapsed="0.117707"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.508887" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.508779" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.508761" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.510146" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.510038" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.510020" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.510701" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.510351" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.511230" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.510878" elapsed="0.000378"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.537814" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.511819" elapsed="0.026203"/>
</kw>
<msg time="2026-04-07T17:18:15.538194" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.538240" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.511411" elapsed="0.026865"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.603449" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.538830" elapsed="0.065005"/>
</kw>
<msg time="2026-04-07T17:18:15.604169" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.604236" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.538443" elapsed="0.065846"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.604885" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.604453" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.604403" elapsed="0.000663"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.605913" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.605281" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.606470" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.606169" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.606143" elapsed="0.000551"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.606747" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.610223" elapsed="0.000716"/>
</kw>
<kw name="Open 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-07T17:18:15.612281" elapsed="0.000758"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.614369" elapsed="0.000457"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.608105" elapsed="0.006822"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.607196" elapsed="0.007914"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.509725" elapsed="0.105531"/>
</kw>
<msg time="2026-04-07T17:18:15.615391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.615487" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.509116" elapsed="0.106426"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.615808" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.615655" elapsed="0.000237"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.615627" elapsed="0.000300"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.616472" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.616813" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.616884" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.508440" elapsed="0.108655"/>
</kw>
<msg time="2026-04-07T17:18:15.617195" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.617240" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.503805" elapsed="0.113474"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.617605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.617357" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.617340" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:15.503669" elapsed="0.114037"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:15.265939" elapsed="0.351803"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:15.263598" elapsed="0.354208"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:15.259070" elapsed="0.358798"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.258632" elapsed="0.359284"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:15.255952" elapsed="0.362038"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:15.626520" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.622559" elapsed="0.004010">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.255362" elapsed="0.371394">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t10" name="Verify Port Is Modified Before Fail" 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-07T17:18:15.631325" elapsed="0.000450"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:15.631022" elapsed="0.000814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.633037" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.632885" elapsed="0.000264"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.632864" 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-07T17:18:15.638690" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.638571" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.638551" elapsed="0.000219"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.639994" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:15.639510" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.640504" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:15.640195" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:15.640574" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:15.640730" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:15.639047" elapsed="0.001708"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.646010" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.645887" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.645868" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.647289" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.647181" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.647164" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.647875" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.647511" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.648325" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.648073" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.679059" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.648884" elapsed="0.030332"/>
</kw>
<msg time="2026-04-07T17:18:15.679396" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.679461" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.648503" elapsed="0.030997"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.737192" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.680104" elapsed="0.057283"/>
</kw>
<msg time="2026-04-07T17:18:15.737694" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.737739" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.679669" elapsed="0.058107"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.738102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.737856" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.737835" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.738721" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.738349" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.739103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.738872" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.738854" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.739285" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.741614" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:18:15.743083" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.744511" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.740167" elapsed="0.004737"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.739563" elapsed="0.005473"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.646857" elapsed="0.098281"/>
</kw>
<msg time="2026-04-07T17:18:15.745230" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.745274" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.646225" elapsed="0.099086"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.745495" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.745388" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.745369" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.745985" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.746317" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.746387" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.645548" elapsed="0.100945"/>
</kw>
<msg time="2026-04-07T17:18:15.746585" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.746628" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.641152" elapsed="0.105513"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.747013" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.746740" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.746722" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:15.641011" elapsed="0.106104"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.752579" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.752472" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.752453" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.753824" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.753718" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.753700" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.754397" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.754043" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.754818" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.754575" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.785213" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.755477" elapsed="0.029921"/>
</kw>
<msg time="2026-04-07T17:18:15.785606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.785651" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.755080" elapsed="0.030608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.838901" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.786270" elapsed="0.052887"/>
</kw>
<msg time="2026-04-07T17:18:15.839346" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.839391" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.785857" elapsed="0.053572"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.839735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.839511" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.839489" elapsed="0.000345"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.840363" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.839990" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.840724" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.840514" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.840496" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.840855" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.843216" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:18:15.844664" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.846082" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.841715" elapsed="0.004760"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.841139" elapsed="0.005446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.753421" elapsed="0.093263"/>
</kw>
<msg time="2026-04-07T17:18:15.846775" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.846818" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.752790" elapsed="0.094066"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.847055" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.846933" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.846914" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.847541" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.847869" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.847941" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.752135" elapsed="0.095949"/>
</kw>
<msg time="2026-04-07T17:18:15.848176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.848220" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.747397" elapsed="0.100860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.848581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.848331" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.848314" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:15.747239" elapsed="0.101442"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.854227" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.854115" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.854093" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.855572" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.855458" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.855441" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:15.856274" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.855802" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.856697" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:15.856453" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.887635" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:15.857273" elapsed="0.030559"/>
</kw>
<msg time="2026-04-07T17:18:15.888055" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:15.888103" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.856876" elapsed="0.031265"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:15.941740" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:15.888781" elapsed="0.053160"/>
</kw>
<msg time="2026-04-07T17:18:15.942134" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:15.942180" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.888339" elapsed="0.053877"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.942551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.942308" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.942281" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.943224" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.942798" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.943630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.943381" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.943359" elapsed="0.000371"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:15.943766" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:15.946213" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:18:15.947683" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:15.949172" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.944711" elapsed="0.004873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:15.944080" elapsed="0.005622"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:15.855130" elapsed="0.094675"/>
</kw>
<msg time="2026-04-07T17:18:15.949901" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.949945" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.854467" elapsed="0.095532"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:15.950250" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:15.950140" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.950119" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.950746" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.951162" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.951238" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:15.853639" elapsed="0.097713"/>
</kw>
<msg time="2026-04-07T17:18:15.951451" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:15.951494" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.848936" elapsed="0.102596"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.951858" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.951610" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:15.951592" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:15.848802" elapsed="0.103158"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:15.640813" elapsed="0.311314"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:15.638166" elapsed="0.314027"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:15.632545" elapsed="0.319709"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:15.632049" elapsed="0.320253"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:15.628169" elapsed="0.324194"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.959294" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:15.958892" elapsed="0.000430"/>
</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-07T17:18:15.969247" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:15.968834" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.969738" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:15.969433" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:15.969807" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:15.969977" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:15.968467" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.975444" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:15.975136" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:15.975518" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:15.975665" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:15.974738" elapsed="0.000952"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.981923" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.981676" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:15.982381" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:15.982139" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:15.992349" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:15.992548" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:15.992683" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.984597" elapsed="0.008577">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:15.982491" elapsed="0.010773">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.993457" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:15.993298" elapsed="0.000225"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:15.982472" elapsed="0.011075">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.993928" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.994080" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:15.994044" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:15.994025" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:15.994285" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.994354" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.976044" elapsed="0.018416">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:15.994521" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:18:15.974204" elapsed="0.020409">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:15.994844" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:15.970209" elapsed="0.024712">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:15.970063" elapsed="0.024964">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.967794" elapsed="0.027333">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:17.011594" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:17.011101" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:17.012131" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:17.011798" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:17.012314" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:18:17.012499" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:17.010696" elapsed="0.001828"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:17.017882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:17.017583" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:17.017954" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:18:17.018140" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:17.017244" elapsed="0.000921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:17.024593" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:17.024327" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:17.025056" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:17.024791" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:17.035008" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:17.035156" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:17.035264" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:17.027149" elapsed="0.008503">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:17.025177" elapsed="0.010559">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:17.035921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:17.035770" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:17.025155" elapsed="0.010872">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:17.036393" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:17.036524" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:17.036487" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:17.036471" elapsed="0.000120"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:17.036730" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:17.036798" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:17.018505" elapsed="0.018395">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:17.036959" elapsed="0.000030"/>
</return>
<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="FAIL" start="2026-04-07T17:18:17.016745" elapsed="0.020323">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:17.037332" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:17.012736" elapsed="0.024673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:17.012585" elapsed="0.024884">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:17.009817" elapsed="0.027750">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:18.054378" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:18.053886" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:18.054896" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:18.054577" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:18.054985" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:18:18.055158" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:18.053501" elapsed="0.001682"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:18.060596" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:18.060298" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:18.060672" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:18.060818" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:18.059940" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:18.067211" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:18.066938" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:18.067653" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:18.067406" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:18.077390" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:18.077534" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:18.077638" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:18.069669" elapsed="0.008379">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:18.067768" elapsed="0.010362">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:18.078316" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:18.078164" elapsed="0.000272"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:18.067747" elapsed="0.010715">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:18.078835" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:18.078986" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:18.078930" elapsed="0.000100"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:18.078914" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:18.079190" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:18.079259" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:18.061236" elapsed="0.018125">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:18.079422" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:18:18.059452" elapsed="0.020061">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:18.079746" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:18.055381" elapsed="0.024441">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:18.055239" elapsed="0.024639">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:18.052633" elapsed="0.027350">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:19.095011" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:19.094398" elapsed="0.000654"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:19.095708" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:19.095277" elapsed="0.000467"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:19.095810" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:18:19.096056" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:19.093854" elapsed="0.002236"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:19.101547" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:19.101247" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:19.101619" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:19.101769" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:19.100893" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:19.109491" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:19.109232" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:19.109931" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:19.109687" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:19.121166" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:19.121305" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:19.121415" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:19.112046" elapsed="0.009768">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:19.110065" elapsed="0.011862">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:19.122210" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:19.121995" elapsed="0.000307"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:19.110045" elapsed="0.012291">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:19.122845" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:19.123055" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:19.123001" elapsed="0.000114"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:19.122957" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:19.123340" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:19.123437" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:19.102141" elapsed="0.021439">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:19.123666" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:18:19.100410" elapsed="0.023386">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:19.124146" elapsed="0.000035"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:19.096389" elapsed="0.027870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:19.096196" elapsed="0.028144">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:19.092855" elapsed="0.031612">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:20.141255" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:20.140704" elapsed="0.000588"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:20.141788" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:20.141468" elapsed="0.000426"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:20.141948" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:18:20.142169" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:20.140303" elapsed="0.001890"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:20.147519" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:20.147214" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:20.147592" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:20.147765" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:20.146850" elapsed="0.000940"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:20.154255" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:20.153990" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:20.154697" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:20.154454" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:20.165727" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:20.165880" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:20.166013" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:20.156893" elapsed="0.009535">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:20.154823" elapsed="0.011690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:20.166700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:20.166548" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:20.154801" elapsed="0.011993">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:20.167179" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:20.167311" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:20.167275" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:20.167258" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:20.167516" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:20.167584" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:20.148158" elapsed="0.019563">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:20.167789" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:18:20.146368" elapsed="0.021514">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:20.168165" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:20.142408" elapsed="0.025836">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:20.142257" elapsed="0.026048">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:20.139427" elapsed="0.028970">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:21.184391" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:21.183906" elapsed="0.000515"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.184899" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:21.184586" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:21.184988" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:18:21.185158" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:21.183519" elapsed="0.001665"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.190485" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:21.190186" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:21.190557" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:21.190702" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.189823" elapsed="0.000904"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.197143" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.196871" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.197581" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.197339" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:21.207811" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:21.207951" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:21.208076" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.199616" elapsed="0.008845">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:21.197697" elapsed="0.010847">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.208728" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.208578" elapsed="0.000266"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:21.197676" elapsed="0.011194">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.209256" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.209390" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.209353" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:21.209336" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.209592" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.209662" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.191079" elapsed="0.018686">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.209826" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:18:21.189339" elapsed="0.020579">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:21.210160" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:21.185382" elapsed="0.024856">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:21.185241" elapsed="0.025054">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.182747" elapsed="0.027637">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:18:21.210479" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:18:15.959510" elapsed="5.251060">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.956848" elapsed="5.253834">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:15.627346" elapsed="5.583489">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s2-t11" name="Delete Port In Owner Before Fail" line="63">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:21.214909" elapsed="0.000363"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:21.214551" elapsed="0.000800"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.216719" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.216566" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.216540" elapsed="0.000275"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.223462" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.223313" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.223288" elapsed="0.000267"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.224755" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:21.224378" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.225266" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:21.224938" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:21.225337" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:21.225490" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:21.224005" elapsed="0.001510"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.230524" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.230416" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.230397" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.231814" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.231709" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.231691" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.232405" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.232041" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.232835" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.232587" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.264538" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.233409" elapsed="0.031299"/>
</kw>
<msg time="2026-04-07T17:18:21.264881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.264926" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.233030" elapsed="0.031932"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.331449" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.265596" elapsed="0.066066"/>
</kw>
<msg time="2026-04-07T17:18:21.331851" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.331899" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.265190" elapsed="0.066746"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.332314" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.332062" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.332034" elapsed="0.000386"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.332961" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.332562" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.333341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.333129" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.333111" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.333476" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.335886" elapsed="0.000594"/>
</kw>
<kw name="Open 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-07T17:18:21.337428" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.338849" elapsed="0.000554"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.334383" elapsed="0.005095"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.333770" elapsed="0.005825"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.231410" elapsed="0.108286"/>
</kw>
<msg time="2026-04-07T17:18:21.339788" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.339832" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.230735" elapsed="0.109134"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.340084" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.339946" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.339927" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.340564" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.340896" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.341007" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.230081" elapsed="0.111038"/>
</kw>
<msg time="2026-04-07T17:18:21.341211" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.341254" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.225863" elapsed="0.115428"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.341609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.341365" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.341348" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:21.225729" elapsed="0.115981"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.347052" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.346927" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.346908" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.348330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.348223" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.348205" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.348884" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.348534" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.349324" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.349077" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.393783" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.349880" elapsed="0.044081"/>
</kw>
<msg time="2026-04-07T17:18:21.394160" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.394207" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.349502" elapsed="0.044741"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.450628" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.394793" elapsed="0.056141"/>
</kw>
<msg time="2026-04-07T17:18:21.451176" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.451226" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.394408" elapsed="0.056856"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.451614" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.451362" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.451334" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.452305" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.451867" elapsed="0.000523"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.452672" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.452457" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.452439" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.452805" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.455249" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:18:21.456683" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.458078" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.453723" elapsed="0.004743"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.453117" elapsed="0.005462"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.347891" elapsed="0.110788"/>
</kw>
<msg time="2026-04-07T17:18:21.458771" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.458815" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.347280" elapsed="0.111572"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.459057" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.458934" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.458915" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.459543" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.460088" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.460162" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.346586" elapsed="0.113685"/>
</kw>
<msg time="2026-04-07T17:18:21.460363" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.460407" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.342076" elapsed="0.118367"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.460763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.460519" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.460502" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:21.341834" elapsed="0.119031"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.466173" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.466066" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.466048" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.467513" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.467407" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.467389" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.468089" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.467717" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.468510" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.468267" elapsed="0.000268"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.510224" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.469081" elapsed="0.041364"/>
</kw>
<msg time="2026-04-07T17:18:21.510667" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.510715" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.468690" elapsed="0.042062"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.560504" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.511519" elapsed="0.049184"/>
</kw>
<msg time="2026-04-07T17:18:21.560872" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.560918" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.511012" elapsed="0.049941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.561324" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.561076" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.561047" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.561950" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.561574" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.562331" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.562120" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.562101" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.562468" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.564930" elapsed="0.000563"/>
</kw>
<kw name="Open 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-07T17:18:21.566447" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.567886" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.563424" elapsed="0.004879"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.562785" elapsed="0.005635"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.467106" elapsed="0.101414"/>
</kw>
<msg time="2026-04-07T17:18:21.568616" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.568661" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.466451" elapsed="0.102247"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.568883" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.568775" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.568757" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.569412" elapsed="0.000079"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.569813" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.569884" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.465714" elapsed="0.104397"/>
</kw>
<msg time="2026-04-07T17:18:21.570210" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.570253" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.461161" elapsed="0.109128"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.570612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.570367" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.570349" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:21.461023" elapsed="0.109690"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:21.225566" elapsed="0.345185"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:21.222752" elapsed="0.348063"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:21.216168" elapsed="0.354708"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.215557" elapsed="0.355367"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:21.211815" elapsed="0.359181"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:21.582729" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.579018" elapsed="0.003753">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.211244" elapsed="0.371686">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t12" name="Delete Bridge In Owner And Verify Before Fail" line="67">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:21.586279" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:21.586020" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.587755" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.587645" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.587623" 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-07T17:18:21.592372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.592266" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.592248" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.593450" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:21.593061" elapsed="0.000416"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.593933" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:21.593633" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:21.594018" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:21.594172" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:21.592668" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.599382" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.599274" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.599255" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.600615" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.600510" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.600492" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.601248" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.600861" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.601676" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.601429" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.633554" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.602256" elapsed="0.031472"/>
</kw>
<msg time="2026-04-07T17:18:21.633903" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.633950" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.601858" elapsed="0.032167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.702760" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.634599" elapsed="0.068415"/>
</kw>
<msg time="2026-04-07T17:18:21.703211" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.703263" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.634201" elapsed="0.069099"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.703661" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.703398" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.703367" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.704351" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.703914" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.704724" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.704508" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.704489" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.704860" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.707323" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:18:21.708797" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.710222" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.705807" elapsed="0.004812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.705185" elapsed="0.005549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.600212" elapsed="0.110633"/>
</kw>
<msg time="2026-04-07T17:18:21.710946" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.711038" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.599594" elapsed="0.111483"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.711266" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.711157" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.711138" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.711743" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.712175" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.712250" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.598914" elapsed="0.113445"/>
</kw>
<msg time="2026-04-07T17:18:21.712453" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.712496" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.594563" elapsed="0.117968"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.712854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.712607" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.712590" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:21.594424" elapsed="0.118532"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.718461" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.718341" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.718322" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.719740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.719634" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.719616" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.720429" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.719953" elapsed="0.000503"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.720875" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.720622" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.748760" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.721454" elapsed="0.027488"/>
</kw>
<msg time="2026-04-07T17:18:21.749144" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.749190" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.721073" elapsed="0.028152"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.815418" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.749776" elapsed="0.065867"/>
</kw>
<msg time="2026-04-07T17:18:21.815861" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.815911" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.749389" elapsed="0.066558"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.816318" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.816071" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.816046" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.816945" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.816560" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.817327" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.817114" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.817096" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.817458" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.819894" elapsed="0.000567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.821423" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.822856" elapsed="0.000381"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.818410" elapsed="0.004899"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.817792" elapsed="0.005633"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.719324" elapsed="0.104202"/>
</kw>
<msg time="2026-04-07T17:18:21.823619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.823664" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.718679" elapsed="0.105022"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.823892" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.823777" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.823758" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.824394" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.824778" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.824852" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.717994" elapsed="0.106965"/>
</kw>
<msg time="2026-04-07T17:18:21.825081" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.825131" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.713259" elapsed="0.111908"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.825488" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.825242" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.825225" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:21.713119" elapsed="0.112470"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.831061" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.830920" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.830902" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.832344" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.832236" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.832217" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.832906" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.832550" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.833451" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.833195" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.863735" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.834027" elapsed="0.029893"/>
</kw>
<msg time="2026-04-07T17:18:21.864122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.864169" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.833632" elapsed="0.030572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.927394" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:21.864761" elapsed="0.062895"/>
</kw>
<msg time="2026-04-07T17:18:21.927839" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:21.927886" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.864373" elapsed="0.063550"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.928288" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.928041" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.928011" elapsed="0.000382"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.928923" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:21.928529" elapsed="0.000500"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.929309" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.929096" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.929078" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:21.929441" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:21.932114" elapsed="0.000575"/>
</kw>
<kw name="Open 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-07T17:18:21.933646" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:21.935187" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:21.930373" elapsed="0.005226"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:21.929719" elapsed="0.005996"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.831896" elapsed="0.103919"/>
</kw>
<msg time="2026-04-07T17:18:21.935915" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.935961" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.831276" elapsed="0.104757"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:21.936222" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:21.936112" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.936093" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.936708" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.937054" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.937125" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.830570" elapsed="0.106663"/>
</kw>
<msg time="2026-04-07T17:18:21.937326" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:21.937370" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.825849" elapsed="0.111557"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:21.937731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:21.937481" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.937464" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:21.825712" elapsed="0.112120"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:21.594252" elapsed="0.343613"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:21.591896" elapsed="0.346028"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:21.587308" elapsed="0.350751"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.586687" elapsed="0.351426"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:21.584015" elapsed="0.354171"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:21.950083" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.946366" elapsed="0.003755">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:21.583410" elapsed="0.366863">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t13" name="Kill Candidate Instance" 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-07T17:18:21.953584" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:21.953321" elapsed="0.000536"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.954844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.954732" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.954714" 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-07T17:18:21.959455" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.959350" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.959333" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.960500" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:21.960122" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:21.960997" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:21.960682" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:21.961066" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:21.961218" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:21.959738" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.966423" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.966314" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.966294" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:21.967711" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:21.967605" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:21.967587" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:21.968298" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:21.967914" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.968728" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:21.968479" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:21.999270" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:21.969306" elapsed="0.030125"/>
</kw>
<msg time="2026-04-07T17:18:21.999601" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:21.999648" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.968911" elapsed="0.030774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.046236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.000275" elapsed="0.046146"/>
</kw>
<msg time="2026-04-07T17:18:22.046588" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.046633" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.999852" elapsed="0.046852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.047048" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.046783" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.046763" elapsed="0.000390"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.047656" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.047289" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.048026" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.047801" elapsed="0.000442"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.047783" elapsed="0.000485"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.048300" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.050584" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:18:22.052048" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.053423" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.049146" elapsed="0.004665"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.048563" elapsed="0.005361"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:21.967307" elapsed="0.086729"/>
</kw>
<msg time="2026-04-07T17:18:22.054126" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.054169" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.966643" elapsed="0.087562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.054383" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.054279" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.054261" elapsed="0.000203"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.054868" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.055243" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.055315" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:21.965941" elapsed="0.089478"/>
</kw>
<msg time="2026-04-07T17:18:22.055510" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.055553" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.961601" elapsed="0.093987"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.055902" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.055661" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.055645" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:21.961465" elapsed="0.094551"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.062770" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.062663" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.062644" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.064041" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.063919" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.063901" elapsed="0.000206"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.064633" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.064277" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.065312" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.064810" elapsed="0.000528"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.095580" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.065871" elapsed="0.029865"/>
</kw>
<msg time="2026-04-07T17:18:22.095902" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.095948" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.065494" elapsed="0.030509"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.138889" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.096551" elapsed="0.042680"/>
</kw>
<msg time="2026-04-07T17:18:22.139503" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.139574" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.096171" elapsed="0.043455"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.140156" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.139758" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.139721" elapsed="0.000594"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.141120" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.140519" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.141648" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.141335" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.141308" elapsed="0.000499"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.141865" elapsed="0.000052"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.145533" elapsed="0.000791"/>
</kw>
<kw name="Open 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-07T17:18:22.147788" elapsed="0.000885"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.149625" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.143271" elapsed="0.006782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.142324" elapsed="0.007857"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.063621" elapsed="0.086664"/>
</kw>
<msg time="2026-04-07T17:18:22.150377" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.150421" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.063009" elapsed="0.087447"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.150643" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.150535" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.150515" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.151181" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.151519" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.151641" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.062326" elapsed="0.089426"/>
</kw>
<msg time="2026-04-07T17:18:22.151855" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.151899" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.056274" elapsed="0.095660"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.152295" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.152040" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.152022" elapsed="0.000359"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:22.056141" elapsed="0.096264"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.157868" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.157759" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.157741" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.159196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.159079" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.159056" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.159764" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.159404" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.160303" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.159942" elapsed="0.000388"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.192923" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.160880" elapsed="0.032247"/>
</kw>
<msg time="2026-04-07T17:18:22.193293" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.193339" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.160486" elapsed="0.032888"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.235319" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.193920" elapsed="0.041624"/>
</kw>
<msg time="2026-04-07T17:18:22.235709" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.235754" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.193538" elapsed="0.042251"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.236123" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.235864" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.235845" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.236750" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.236380" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.237139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.236894" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.236876" elapsed="0.000364"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.237272" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.239791" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.241452" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.242895" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.238142" elapsed="0.005174"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.237521" elapsed="0.005910"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.158729" elapsed="0.084802"/>
</kw>
<msg time="2026-04-07T17:18:22.243622" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.243665" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.158111" elapsed="0.085590"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.243885" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.243778" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.243759" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.244384" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.244710" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.244781" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.157416" elapsed="0.087470"/>
</kw>
<msg time="2026-04-07T17:18:22.245008" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.245053" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.152674" elapsed="0.092427"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.245431" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.245184" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.245167" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:22.152537" elapsed="0.092993"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:21.961296" elapsed="0.284264"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:21.958990" elapsed="0.286626"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:21.954438" elapsed="0.291235"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:21.954020" elapsed="0.291699"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:21.951214" elapsed="0.294557"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:18:22.250288" level="FAIL">Variable '${original_candidate}' not found.</msg>
<var>${new_cluster_list}</var>
<arg>${original_candidate}</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-07T17:18:22.246045" elapsed="0.004285">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.250505" elapsed="0.000022"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-07T17:18:21.950623" elapsed="0.300053">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t14" name="Check Shards Status After Fail" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:22.254041" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:22.253769" 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-07T17:18:22.255308" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.255200" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.255182" 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-07T17:18:22.260099" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.259932" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.259914" elapsed="0.000258"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.261177" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:22.260766" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.261676" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:22.261370" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:22.261747" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:22.261900" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:22.260395" elapsed="0.001530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.267298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.267190" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.267171" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.268575" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.268468" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.268451" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.269159" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.268780" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.269586" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.269341" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.302831" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.270184" elapsed="0.032882"/>
</kw>
<msg time="2026-04-07T17:18:22.303263" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.303309" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.269766" elapsed="0.033581"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.353381" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.303902" elapsed="0.049684"/>
</kw>
<msg time="2026-04-07T17:18:22.353778" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.353826" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.303513" elapsed="0.050351"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.354224" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.353951" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.353926" elapsed="0.000402"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.354887" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.354468" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.355282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.355057" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.355039" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.355416" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.357768" elapsed="0.000551"/>
</kw>
<kw name="Open 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-07T17:18:22.359339" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.360779" elapsed="0.000359"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.356294" elapsed="0.004919"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.355686" elapsed="0.005641"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.268166" elapsed="0.093262"/>
</kw>
<msg time="2026-04-07T17:18:22.361520" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.361564" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.267511" elapsed="0.094090"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.361784" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.361678" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.361659" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.362327" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.362657" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.362742" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.266816" elapsed="0.096035"/>
</kw>
<msg time="2026-04-07T17:18:22.362944" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.363005" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.262317" elapsed="0.100727"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.363375" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.363128" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.363110" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:22.262179" elapsed="0.101296"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.369131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.369013" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.368994" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.370386" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.370280" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.370262" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.370991" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.370592" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.371439" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.371181" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.401028" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.372282" elapsed="0.028916"/>
</kw>
<msg time="2026-04-07T17:18:22.401365" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.401412" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.371618" elapsed="0.029831"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.450755" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.402032" elapsed="0.048968"/>
</kw>
<msg time="2026-04-07T17:18:22.451184" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.451231" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.401614" elapsed="0.049654"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.451563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.451345" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.451325" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.452216" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.451799" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.452579" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.452366" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.452348" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.452710" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.455064" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:18:22.456659" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.458129" elapsed="0.000353"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.453564" elapsed="0.004990"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.452959" elapsed="0.005726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.369954" elapsed="0.088833"/>
</kw>
<msg time="2026-04-07T17:18:22.458879" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.458922" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.369344" elapsed="0.089615"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.459181" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.459059" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.459036" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.459640" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.459962" elapsed="0.000057"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.460067" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.368645" elapsed="0.091554"/>
</kw>
<msg time="2026-04-07T17:18:22.460312" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.460367" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.363737" elapsed="0.096677"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.460738" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.460492" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.460474" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:22.363601" elapsed="0.097237"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.466986" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.466861" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.466842" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.468431" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.468322" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.468303" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.469011" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.468638" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.469449" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.469200" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.499946" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.470031" elapsed="0.030173"/>
</kw>
<msg time="2026-04-07T17:18:22.500372" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.500419" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.469630" elapsed="0.030825"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.561222" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.501029" elapsed="0.060625"/>
</kw>
<msg time="2026-04-07T17:18:22.562077" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.562182" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.500620" elapsed="0.061644"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.563012" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.562447" elapsed="0.000643"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.562399" elapsed="0.000719"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.563649" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.563259" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.564023" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.563796" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.563778" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.564156" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.566498" elapsed="0.000558"/>
</kw>
<kw name="Open 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-07T17:18:22.567980" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.569413" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.565039" elapsed="0.004767"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.564428" elapsed="0.005492"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.467864" elapsed="0.102170"/>
</kw>
<msg time="2026-04-07T17:18:22.570127" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.570171" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.467245" elapsed="0.102964"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.570391" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.570285" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.570266" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.570875" elapsed="0.000067"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.571280" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.571351" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.466486" elapsed="0.104971"/>
</kw>
<msg time="2026-04-07T17:18:22.571548" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.571592" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.461119" elapsed="0.110510"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.571945" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.571702" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.571685" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:22.460957" elapsed="0.111105"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:22.261996" elapsed="0.310098"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:22.259561" elapsed="0.312590"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:22.254891" elapsed="0.317319"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.254453" elapsed="0.317803"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:22.251706" elapsed="0.320604"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:22.576691" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-07T17:18:22.572515" elapsed="0.004215">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-04-07T17:18:22.251119" elapsed="0.325767">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s2-t15" name="Check Entity Owner Status And Find Owner and Candidate After Fail" 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-07T17:18:22.580275" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:22.580016" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.581498" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.581391" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.581373" 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-07T17:18:22.586103" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.585997" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.585979" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.587176" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:22.586778" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.587661" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:22.587359" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:22.587731" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:22.587882" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:22.586386" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.593116" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.593003" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.592983" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.594370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.594265" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.594247" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.594998" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.594626" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.595431" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.595184" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.631359" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.596006" elapsed="0.035524"/>
</kw>
<msg time="2026-04-07T17:18:22.631697" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.631743" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.595611" elapsed="0.036168"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.722792" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.632434" elapsed="0.090580"/>
</kw>
<msg time="2026-04-07T17:18:22.723185" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.723230" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.631946" elapsed="0.091320"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.723560" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.723343" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.723324" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.724190" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.723799" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.724556" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.724348" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.724330" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.724686" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.726996" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.728438" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.729820" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.725515" elapsed="0.004712"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.724933" elapsed="0.005407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.593941" elapsed="0.136499"/>
</kw>
<msg time="2026-04-07T17:18:22.730530" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.730586" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.593330" elapsed="0.137294"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.730810" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.730701" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.730682" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.731294" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.731671" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.731743" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.592655" elapsed="0.139196"/>
</kw>
<msg time="2026-04-07T17:18:22.731942" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.732016" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.588285" elapsed="0.143771"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.732376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.732132" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.732114" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:22.588149" elapsed="0.144327"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.737781" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.737675" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.737656" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.739106" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.738948" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.738930" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.739668" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.739314" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.740351" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.739846" elapsed="0.000545"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.780294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.740960" elapsed="0.039504"/>
</kw>
<msg time="2026-04-07T17:18:22.780632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.780678" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.740570" elapsed="0.040144"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.865706" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.781283" elapsed="0.085068"/>
</kw>
<msg time="2026-04-07T17:18:22.866877" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.867040" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.780880" elapsed="0.086224"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.867737" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.867275" elapsed="0.000584"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.867222" elapsed="0.000681"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:22.868828" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:22.868143" elapsed="0.000858"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.869427" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.869104" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.869077" elapsed="0.000499"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:22.869719" elapsed="0.000057"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:22.873510" elapsed="0.000802"/>
</kw>
<kw name="Open 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-07T17:18:22.875824" elapsed="0.000759"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:22.877947" elapsed="0.000495"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:22.871245" elapsed="0.007358"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:22.870205" elapsed="0.008589"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.738649" elapsed="0.140300"/>
</kw>
<msg time="2026-04-07T17:18:22.879100" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.879146" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.738008" elapsed="0.141177"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:22.879378" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:22.879268" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.879247" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.879875" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.880269" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.880343" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.737338" elapsed="0.143117"/>
</kw>
<msg time="2026-04-07T17:18:22.880554" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:22.880599" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.732729" elapsed="0.147908"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:22.881075" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.880715" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.880697" elapsed="0.000460"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:22.732595" elapsed="0.148586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.886807" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.886688" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.886668" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:22.888103" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:22.887991" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.887949" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:22.888674" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:22.888310" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.889121" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:22.888852" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.920492" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:22.889681" elapsed="0.030973"/>
</kw>
<msg time="2026-04-07T17:18:22.920824" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:22.920870" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.889300" elapsed="0.031606"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:22.998844" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:22.921488" elapsed="0.077808"/>
</kw>
<msg time="2026-04-07T17:18:22.999505" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:22.999552" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.921091" elapsed="0.078499"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.000002" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:22.999698" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:22.999666" elapsed="0.000447"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.000681" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.000258" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.001069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.000842" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.000823" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.001208" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.003781" elapsed="0.000569"/>
</kw>
<kw name="Open 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-07T17:18:23.005327" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.006817" elapsed="0.000427"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.002216" elapsed="0.005119"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.001517" elapsed="0.005963"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:22.887662" elapsed="0.119943"/>
</kw>
<msg time="2026-04-07T17:18:23.007716" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.007762" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.887041" elapsed="0.120758"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.008020" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.007879" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.007860" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.008530" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.008874" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.008946" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:22.886313" elapsed="0.122769"/>
</kw>
<msg time="2026-04-07T17:18:23.009197" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.009244" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.881467" elapsed="0.127816"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.009617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.009363" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.009345" elapsed="0.000351"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:22.881325" elapsed="0.128428"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:22.587961" elapsed="0.421833"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:22.585630" elapsed="0.424226"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:22.581109" elapsed="0.428808"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:22.580678" elapsed="0.429301"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:22.577870" elapsed="0.432174"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:23.021941" level="FAIL">Variable '${original_owner}' not found.</msg>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>${original_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.018138" elapsed="0.003859">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_candidate}</var>
<arg>${new_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.022208" elapsed="0.000024"/>
</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-07T17:18:23.022394" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.022591" elapsed="0.000021"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:18:22.577262" elapsed="0.445499">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t16" name="Create Bridge Manually and Verify After Fail" line="90">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:23.026088" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:23.025807" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.027387" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.027265" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.027243" 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-07T17:18:23.032107" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.031988" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.031954" elapsed="0.000237"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.033205" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:23.032790" elapsed="0.000442"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.033696" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:23.033390" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:23.033765" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:23.033935" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:23.032415" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.039480" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.039371" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.039351" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.040760" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.040653" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.040635" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.041369" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.040989" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.041807" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.041552" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.073834" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.042413" elapsed="0.031611"/>
</kw>
<msg time="2026-04-07T17:18:23.074265" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.074313" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.042011" elapsed="0.032337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.141191" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.074934" elapsed="0.066459"/>
</kw>
<msg time="2026-04-07T17:18:23.141565" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.141611" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.074542" elapsed="0.067106"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.141948" elapsed="0.000044"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.141727" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.141706" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.142624" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.142217" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.143011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.142779" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.142761" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.143144" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.145447" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:18:23.146911" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.148395" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.143995" elapsed="0.004785"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.143397" elapsed="0.005494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.040350" elapsed="0.108656"/>
</kw>
<msg time="2026-04-07T17:18:23.149098" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.149142" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.039697" elapsed="0.109481"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.149359" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.149254" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.149235" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.149822" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.150169" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.150240" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.039021" elapsed="0.111325"/>
</kw>
<msg time="2026-04-07T17:18:23.150529" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.150574" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.034374" elapsed="0.116236"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.151026" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.150741" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.150722" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:23.034234" elapsed="0.116896"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.158205" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.158091" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.158069" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.159568" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.159460" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.159441" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.160193" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.159776" elapsed="0.000444"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.160621" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.160375" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.193645" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.161204" elapsed="0.032603"/>
</kw>
<msg time="2026-04-07T17:18:23.193994" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.194042" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.160800" elapsed="0.033278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.254460" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.194643" elapsed="0.060013"/>
</kw>
<msg time="2026-04-07T17:18:23.254832" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.254880" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.194245" elapsed="0.060672"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.255259" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.255026" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.255003" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.255881" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.255507" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.256279" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.256055" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.256037" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.256415" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.258827" elapsed="0.000552"/>
</kw>
<kw name="Open 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-07T17:18:23.260346" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.261861" elapsed="0.000363"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.257302" elapsed="0.005011"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.256683" elapsed="0.005808"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.159158" elapsed="0.103516"/>
</kw>
<msg time="2026-04-07T17:18:23.262790" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.262841" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.158445" elapsed="0.104434"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.263095" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.262959" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.262939" elapsed="0.000253"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.263583" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.263908" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.263996" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.157693" elapsed="0.106413"/>
</kw>
<msg time="2026-04-07T17:18:23.264215" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.264260" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.151389" elapsed="0.112909"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.264621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.264374" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.264357" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:23.151253" elapsed="0.113469"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.324927" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.324783" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.324756" elapsed="0.000281"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.326623" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.326511" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.326491" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.327240" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.326834" elapsed="0.000434"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.327680" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.327424" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.358090" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.328260" elapsed="0.030206"/>
</kw>
<msg time="2026-04-07T17:18:23.358838" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.358938" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.327859" elapsed="0.031196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.419337" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.360292" elapsed="0.059340"/>
</kw>
<msg time="2026-04-07T17:18:23.419866" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.419914" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.359419" elapsed="0.060531"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.420443" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.420107" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.420059" elapsed="0.000604"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.421318" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.420811" elapsed="0.000592"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.421688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.421473" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.421453" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.421827" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.424393" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:18:23.425889" elapsed="0.000544"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.427393" elapsed="0.000351"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.422852" elapsed="0.004964"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.422184" elapsed="0.005755"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.326085" elapsed="0.101973"/>
</kw>
<msg time="2026-04-07T17:18:23.428165" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.428211" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.325241" elapsed="0.103012"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.428443" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.428334" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.428314" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.428939" elapsed="0.000041"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.429302" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.429382" elapsed="0.000022"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.324281" elapsed="0.105236"/>
</kw>
<msg time="2026-04-07T17:18:23.429627" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.429673" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.265013" elapsed="0.164699"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.430087" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.429792" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.429775" elapsed="0.000402"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:23.264848" elapsed="0.165362"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:23.034042" elapsed="0.396243"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:23.031612" elapsed="0.398747"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:23.026941" elapsed="0.403489"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.026522" elapsed="0.403971"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:23.023787" elapsed="0.406771"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:23.439354" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.435244" elapsed="0.004193">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.023174" elapsed="0.416516">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s2-t17" name="Add Port Manually and Verify After Fail" line="94">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:23.443280" elapsed="0.000470"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:23.443017" elapsed="0.000790"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.444844" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.444732" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.444712" 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-07T17:18:23.449658" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.449546" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.449527" elapsed="0.000199"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.450763" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:23.450371" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.451277" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:23.450951" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:23.451349" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:23.451504" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:23.449952" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.457120" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.457008" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.456988" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.458431" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.458316" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.458297" elapsed="0.000203"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.459090" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.458643" elapsed="0.000474"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.459536" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.459274" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.492205" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.460122" elapsed="0.032261"/>
</kw>
<msg time="2026-04-07T17:18:23.492559" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.492607" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.459718" elapsed="0.032924"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.556459" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.493302" elapsed="0.063439"/>
</kw>
<msg time="2026-04-07T17:18:23.557034" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.557105" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.492814" elapsed="0.064342"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.557601" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.557274" elapsed="0.000440"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.557244" elapsed="0.000559"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.558649" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.558040" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.559237" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.558871" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.558844" elapsed="0.000542"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.559434" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.563028" elapsed="0.000756"/>
</kw>
<kw name="Open 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-07T17:18:23.565265" elapsed="0.000732"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.567322" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.560730" elapsed="0.006989"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.559828" elapsed="0.008006"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.457958" elapsed="0.109975"/>
</kw>
<msg time="2026-04-07T17:18:23.568043" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.568087" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.457334" elapsed="0.110788"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.568323" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.568214" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.568193" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.568801" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.569176" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.569251" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.456654" elapsed="0.112707"/>
</kw>
<msg time="2026-04-07T17:18:23.569454" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.569496" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.451918" elapsed="0.117613"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.569851" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.569605" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.569588" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:23.451778" elapsed="0.118171"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.575433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.575326" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.575308" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.576722" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.576616" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.576598" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.577306" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.576930" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.577733" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.577487" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.609840" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.578417" elapsed="0.031621"/>
</kw>
<msg time="2026-04-07T17:18:23.610260" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.610309" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.577949" elapsed="0.032396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.676031" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.610928" elapsed="0.065305"/>
</kw>
<msg time="2026-04-07T17:18:23.676411" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.676456" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.610519" elapsed="0.065973"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.676820" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.676574" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.676552" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.677460" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.677082" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.677820" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.677609" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.677591" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.677952" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.680343" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.681773" elapsed="0.000530"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.683238" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.678857" elapsed="0.004768"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.678257" elapsed="0.005480"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.576315" elapsed="0.107523"/>
</kw>
<msg time="2026-04-07T17:18:23.683928" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.683989" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.575646" elapsed="0.108380"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.684219" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.684110" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.684090" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.684690" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.685034" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.685146" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.574987" elapsed="0.110270"/>
</kw>
<msg time="2026-04-07T17:18:23.685391" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.685434" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.570333" elapsed="0.115135"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.685789" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.685542" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.685525" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:23.570178" elapsed="0.115711"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.691383" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.691273" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.691253" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.692635" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.692528" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.692509" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.693219" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.692841" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.693643" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.693399" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.723463" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.694252" elapsed="0.029491"/>
</kw>
<msg time="2026-04-07T17:18:23.724042" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.724110" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.693823" elapsed="0.030336"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.781690" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.725090" elapsed="0.056816"/>
</kw>
<msg time="2026-04-07T17:18:23.783180" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.783325" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.724447" elapsed="0.058967"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.784192" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.783625" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.783574" elapsed="0.000860"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.785658" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.784743" elapsed="0.001111"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.786541" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.786035" elapsed="0.000671"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.785961" elapsed="0.000799"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.786832" elapsed="0.000064"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.792152" elapsed="0.001164"/>
</kw>
<kw name="Open 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-07T17:18:23.795348" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.796726" elapsed="0.000382"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.788852" elapsed="0.008327"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.787443" elapsed="0.009850"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.692225" elapsed="0.105169"/>
</kw>
<msg time="2026-04-07T17:18:23.797489" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.797532" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.691600" elapsed="0.105968"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.797762" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.797647" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.797628" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.798382" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.798726" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.798796" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.690755" elapsed="0.108150"/>
</kw>
<msg time="2026-04-07T17:18:23.799044" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.799091" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.686179" elapsed="0.112947"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.799450" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.799203" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.799186" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:23.686026" elapsed="0.113526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:23.451590" elapsed="0.347993"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:23.449150" elapsed="0.350495"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:23.444425" elapsed="0.355280"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.443954" elapsed="0.355798"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:23.440653" elapsed="0.359154"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:23.807989" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.804098" elapsed="0.003932">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.440053" elapsed="0.368134">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s2-t18" name="Delete the Bridge Manually and Verify After Fail" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:23.812270" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:23.812012" 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-07T17:18:23.813515" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.813402" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.813384" 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-07T17:18:23.818180" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.818039" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.818021" elapsed="0.000226"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.819235" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:23.818834" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.819759" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:23.819456" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:23.819829" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:23.819995" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:23.818466" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.825199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.825091" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.825071" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.826462" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.826355" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.826337" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.827040" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.826666" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.827471" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.827225" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.857827" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.828048" elapsed="0.029972"/>
</kw>
<msg time="2026-04-07T17:18:23.858220" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.858266" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.827650" elapsed="0.030650"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.931822" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.858854" elapsed="0.073180"/>
</kw>
<msg time="2026-04-07T17:18:23.932204" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:23.932249" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.858465" elapsed="0.073818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.932579" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.932360" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.932340" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:23.933220" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:23.932819" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.933578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.933369" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.933351" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:23.933709" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:23.935999" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:18:23.937423" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:23.938823" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:23.934561" elapsed="0.004706"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:23.933979" elapsed="0.005401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.826044" elapsed="0.113436"/>
</kw>
<msg time="2026-04-07T17:18:23.939570" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.939613" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.825412" elapsed="0.114235"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:23.939829" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:23.939723" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.939705" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.940305" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.940627" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.940699" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.824739" elapsed="0.116065"/>
</kw>
<msg time="2026-04-07T17:18:23.940896" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:23.940940" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.820387" elapsed="0.120614"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:23.941322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:23.941079" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.941062" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:23.820251" elapsed="0.121170"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.946820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.946713" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.946695" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:23.948094" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:23.947960" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:23.947942" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:23.948646" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:23.948298" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.949082" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:23.948823" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:23.979848" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:23.949636" elapsed="0.030387"/>
</kw>
<msg time="2026-04-07T17:18:23.980192" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:23.980237" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.949260" elapsed="0.031011"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.062335" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:23.980834" elapsed="0.081700"/>
</kw>
<msg time="2026-04-07T17:18:24.062705" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.062750" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.980437" elapsed="0.082382"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.063143" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.062900" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.062879" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.063749" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.063382" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.064129" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.063898" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.063880" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.064265" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.066581" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.068037" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.069411" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.065102" elapsed="0.004699"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.064514" elapsed="0.005400"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:23.947663" elapsed="0.122375"/>
</kw>
<msg time="2026-04-07T17:18:24.070131" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.070173" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.947050" elapsed="0.123158"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.070390" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.070285" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.070267" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.070903" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.071247" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.071319" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:23.946378" elapsed="0.125046"/>
</kw>
<msg time="2026-04-07T17:18:24.071516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.071560" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.941673" elapsed="0.129921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.071909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.071668" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.071651" elapsed="0.000367"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:23.941540" elapsed="0.130501"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.077433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.077326" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.077307" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.078708" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.078601" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.078583" elapsed="0.000233"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.079334" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.078961" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.079759" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.079514" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.119534" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.080403" elapsed="0.039290"/>
</kw>
<msg time="2026-04-07T17:18:24.119862" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.119907" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.079938" elapsed="0.040004"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.195189" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.120514" elapsed="0.075033"/>
</kw>
<msg time="2026-04-07T17:18:24.195850" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.195918" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.120129" elapsed="0.075863"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.196580" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.196160" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.196107" elapsed="0.000626"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.197685" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.196935" elapsed="0.000875"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.198275" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.197907" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.197881" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.198466" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.201156" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:18:24.202631" elapsed="0.000516"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.204066" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.199624" elapsed="0.004839"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.198888" elapsed="0.005686"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.078300" elapsed="0.126376"/>
</kw>
<msg time="2026-04-07T17:18:24.204776" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.204822" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.077646" elapsed="0.127212"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.205072" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.204937" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.204918" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.205571" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.206037" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.206112" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.076985" elapsed="0.129241"/>
</kw>
<msg time="2026-04-07T17:18:24.206326" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.206371" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.072295" elapsed="0.134111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.206730" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.206482" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.206465" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:24.072161" elapsed="0.134671"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:23.820078" elapsed="0.386791"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:23.817667" elapsed="0.389269"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:23.813117" elapsed="0.393902"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:23.812685" elapsed="0.394387"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:23.809480" elapsed="0.397654"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:24.215419" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.211468" elapsed="0.003990">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:23.808757" elapsed="0.406863">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s2-t19" name="Create Bridge In Owner and Verify After Fail" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:24.218910" elapsed="0.000229"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:24.218653" 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-07T17:18:24.220173" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.220057" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.220039" 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-07T17:18:24.224870" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.224761" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.224744" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.225947" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:24.225548" elapsed="0.000440"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.226452" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:24.226148" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:24.226521" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:24.226675" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:24.225177" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.231944" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.231836" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.231818" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.233212" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.233101" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.233083" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.233775" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.233417" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.234307" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.234046" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.264373" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.234870" elapsed="0.029664"/>
</kw>
<msg time="2026-04-07T17:18:24.264703" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.264749" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.234486" elapsed="0.030298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.328159" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.265357" elapsed="0.062999"/>
</kw>
<msg time="2026-04-07T17:18:24.328533" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.328581" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.264949" elapsed="0.063667"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.328923" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.328697" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.328676" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.329576" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.329196" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.329954" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.329725" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.329708" elapsed="0.000362"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.330103" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.332435" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.333908" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.335333" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.330941" elapsed="0.004782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.330365" elapsed="0.005470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.232780" elapsed="0.103154"/>
</kw>
<msg time="2026-04-07T17:18:24.336040" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.336083" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.232174" elapsed="0.103944"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.336300" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.336194" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.336176" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.336762" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.337101" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.337210" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.231500" elapsed="0.105820"/>
</kw>
<msg time="2026-04-07T17:18:24.337411" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.337454" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.227088" elapsed="0.110401"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.337806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.337563" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.337546" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:24.226935" elapsed="0.110986"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.343121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.343012" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.342992" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.344376" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.344268" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.344250" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.344937" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.344581" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.345379" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.345132" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.374766" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.345981" elapsed="0.028955"/>
</kw>
<msg time="2026-04-07T17:18:24.375122" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.375168" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.345558" elapsed="0.029646"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.436709" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.375758" elapsed="0.061158"/>
</kw>
<msg time="2026-04-07T17:18:24.437120" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.437166" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.375372" elapsed="0.061828"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.437531" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.437287" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.437263" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.438201" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.437773" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.438568" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.438357" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.438339" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.438698" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.441114" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.442580" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.443964" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.439581" elapsed="0.004795"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.438988" elapsed="0.005502"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.343952" elapsed="0.100637"/>
</kw>
<msg time="2026-04-07T17:18:24.444681" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.444725" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.343341" elapsed="0.101419"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.444942" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.444837" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.444818" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.445426" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.445751" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.445821" elapsed="0.000029"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.342652" elapsed="0.103290"/>
</kw>
<msg time="2026-04-07T17:18:24.446066" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.446110" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.338200" elapsed="0.107944"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.446465" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.446221" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.446204" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:24.338063" elapsed="0.108502"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.453558" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.453449" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.453430" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.454868" elapsed="0.000058"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.454762" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.454744" elapsed="0.000304"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.455550" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.455190" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.456001" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.455729" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.486376" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.456561" elapsed="0.029987"/>
</kw>
<msg time="2026-04-07T17:18:24.486714" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.486759" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.456182" elapsed="0.030611"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.549314" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.487360" elapsed="0.062176"/>
</kw>
<msg time="2026-04-07T17:18:24.549706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.549751" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.486956" elapsed="0.062851"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.550131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.549886" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.549866" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.550737" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.550369" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.551116" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.550885" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.550867" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.551249" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.553514" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:18:24.554951" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.556358" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.552078" elapsed="0.004669"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.551497" elapsed="0.005362"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.454463" elapsed="0.102494"/>
</kw>
<msg time="2026-04-07T17:18:24.557064" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.557107" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.453771" elapsed="0.103371"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.557324" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.557218" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.557200" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.557790" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.558129" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.558201" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.453107" elapsed="0.105199"/>
</kw>
<msg time="2026-04-07T17:18:24.558398" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.558441" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.446826" elapsed="0.111649"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.558791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.558549" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.558532" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:24.446691" elapsed="0.112200"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:24.226756" elapsed="0.332163"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:24.224404" elapsed="0.334599"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:24.219757" elapsed="0.339346"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.219338" elapsed="0.339813"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:24.216640" elapsed="0.342562"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:24.570959" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.567419" elapsed="0.003590">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.216037" elapsed="0.355132">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t20" name="Create Port In Owner and Verify After Fail" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:24.574418" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:24.574156" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.575648" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.575539" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.575520" 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-07T17:18:24.580250" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.580145" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.580127" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.581298" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:24.580905" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.581801" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:24.581480" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:24.581877" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:24.582046" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:24.580536" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.587213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.587107" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.587088" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.588461" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.588356" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.588339" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.589029" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.588665" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.589454" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.589210" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.621727" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.590036" elapsed="0.031870"/>
</kw>
<msg time="2026-04-07T17:18:24.622103" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.622149" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.589630" elapsed="0.032554"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.680080" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.622752" elapsed="0.057521"/>
</kw>
<msg time="2026-04-07T17:18:24.680445" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.680535" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.622358" elapsed="0.058214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.680881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.680654" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.680632" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.681526" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.681150" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.681906" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.681675" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.681656" elapsed="0.000366"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.682055" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.684378" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:18:24.685829" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.687217" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.682894" elapsed="0.004709"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.682321" elapsed="0.005394"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.588059" elapsed="0.099754"/>
</kw>
<msg time="2026-04-07T17:18:24.687905" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.687948" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.587426" elapsed="0.100583"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.688193" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.688087" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.688068" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.688665" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.689005" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.689077" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.586758" elapsed="0.102425"/>
</kw>
<msg time="2026-04-07T17:18:24.689277" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.689319" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.582432" elapsed="0.106923"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.689672" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.689430" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.689413" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:24.582297" elapsed="0.107486"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.695207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.695100" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.695081" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.696492" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.696386" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.696368" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.697104" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.696733" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.697532" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.697284" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.729070" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.698133" elapsed="0.031114"/>
</kw>
<msg time="2026-04-07T17:18:24.729413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.729459" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.697712" elapsed="0.031781"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.787788" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.730076" elapsed="0.057916"/>
</kw>
<msg time="2026-04-07T17:18:24.788165" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.788210" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.729659" elapsed="0.058585"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.788540" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.788321" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.788302" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.789163" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.788778" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.789519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.789311" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.789293" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.789667" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.791981" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:18:24.793417" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.794830" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.790512" elapsed="0.004719"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.789933" elapsed="0.005418"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.696087" elapsed="0.099363"/>
</kw>
<msg time="2026-04-07T17:18:24.795540" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.795584" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.695421" elapsed="0.100198"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.795801" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.795695" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.795677" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.796283" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.796680" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.796751" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.694733" elapsed="0.102125"/>
</kw>
<msg time="2026-04-07T17:18:24.796950" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.797009" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.690059" elapsed="0.106985"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.797364" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.797120" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.797102" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:24.689908" elapsed="0.107556"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.802857" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.802750" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.802731" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.804115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.804007" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.803988" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.804669" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.804319" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.805110" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.804846" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.835300" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.805671" elapsed="0.029807"/>
</kw>
<msg time="2026-04-07T17:18:24.835651" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.835698" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.805289" elapsed="0.030444"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.893104" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.836328" elapsed="0.056969"/>
</kw>
<msg time="2026-04-07T17:18:24.893463" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:24.893509" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.835910" elapsed="0.057633"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.893860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.893623" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.893603" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.894500" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:24.894131" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.894855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.894647" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.894629" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:24.895004" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:24.897353" elapsed="0.000539"/>
</kw>
<kw name="Open 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-07T17:18:24.898816" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:24.900230" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:24.895888" elapsed="0.004739"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:24.895310" elapsed="0.005431"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.803694" elapsed="0.097147"/>
</kw>
<msg time="2026-04-07T17:18:24.900933" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.900991" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.803086" elapsed="0.097943"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:24.901214" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:24.901107" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.901087" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.901713" elapsed="0.000031"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.902067" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.902137" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.802412" elapsed="0.099832"/>
</kw>
<msg time="2026-04-07T17:18:24.902337" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:24.902380" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.797732" elapsed="0.104683"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:24.902733" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:24.902490" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.902473" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:24.797583" elapsed="0.105250"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:24.582127" elapsed="0.320737"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:24.579777" elapsed="0.323145"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:24.575255" elapsed="0.327742"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.574823" elapsed="0.328222"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:24.572169" elapsed="0.330930"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:24.914737" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.910988" elapsed="0.003788">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.571524" elapsed="0.343410">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t21" name="Modify the destination IP of Port In Owner After Fail" line="110">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:24.918134" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:24.917864" 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-07T17:18:24.919361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.919251" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.919233" 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-07T17:18:24.924019" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.923860" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.923842" elapsed="0.000250"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.925095" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:24.924698" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:24.925581" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:24.925279" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:24.925680" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:24.925836" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:24.924325" elapsed="0.001535"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.931132" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.930962" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.930943" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:24.932386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:24.932280" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:24.932263" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:24.932943" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:24.932591" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.933391" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:24.933144" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:24.965781" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:24.933988" elapsed="0.031952"/>
</kw>
<msg time="2026-04-07T17:18:24.966149" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:24.966194" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.933571" elapsed="0.032658"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.056431" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:24.966780" elapsed="0.089855"/>
</kw>
<msg time="2026-04-07T17:18:25.056812" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.056859" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.966395" elapsed="0.090499"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.057235" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.057005" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.056959" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.057879" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.057475" elapsed="0.000505"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.058265" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.058052" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.058033" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.058396" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.060711" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:18:25.062207" elapsed="0.000479"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.063610" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.059230" elapsed="0.004787"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.058645" elapsed="0.005488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:24.931957" elapsed="0.132278"/>
</kw>
<msg time="2026-04-07T17:18:25.064327" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.064372" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.931350" elapsed="0.133058"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.064592" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.064485" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.064466" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.065072" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.065399" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.065471" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:24.930620" elapsed="0.134971"/>
</kw>
<msg time="2026-04-07T17:18:25.065687" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.065731" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.926273" elapsed="0.139493"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.066102" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.065842" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.065824" elapsed="0.000357"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:24.926132" elapsed="0.140072"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.071409" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.071301" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.071283" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.072684" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.072577" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.072559" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.073266" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.072890" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.073735" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.073448" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.105103" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.074331" elapsed="0.030934"/>
</kw>
<msg time="2026-04-07T17:18:25.105435" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.105481" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.073919" elapsed="0.031598"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.183806" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.106152" elapsed="0.077905"/>
</kw>
<msg time="2026-04-07T17:18:25.184225" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.184272" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.105718" elapsed="0.078589"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.184601" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.184384" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.184365" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.185219" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.184834" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.185601" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.185370" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.185352" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.185734" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.187990" elapsed="0.000500"/>
</kw>
<kw name="Open 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-07T17:18:25.189407" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.190776" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.186564" elapsed="0.004615"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.186002" elapsed="0.005286"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.072254" elapsed="0.119133"/>
</kw>
<msg time="2026-04-07T17:18:25.191477" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.191520" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.071625" elapsed="0.119929"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.191735" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.191630" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.191612" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.192209" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.192532" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.192603" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.070938" elapsed="0.121770"/>
</kw>
<msg time="2026-04-07T17:18:25.192800" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.192843" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.066464" elapsed="0.126413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.193226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.192951" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.192934" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:25.066329" elapsed="0.126996"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.198713" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.198606" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.198587" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.200012" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.199890" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.199872" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.200569" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.200218" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.201091" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.200748" elapsed="0.000370"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.230778" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.201897" elapsed="0.029055"/>
</kw>
<msg time="2026-04-07T17:18:25.231142" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.231188" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.201273" elapsed="0.029950"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.310044" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.231816" elapsed="0.078422"/>
</kw>
<msg time="2026-04-07T17:18:25.310404" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.310449" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.231388" elapsed="0.079095"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.310775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.310559" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.310539" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.311413" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.311038" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.311772" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.311563" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.311545" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.311904" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.314239" elapsed="0.000500"/>
</kw>
<kw name="Open 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-07T17:18:25.315653" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.317028" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.312739" elapsed="0.004674"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.312178" elapsed="0.005359"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.199592" elapsed="0.118048"/>
</kw>
<msg time="2026-04-07T17:18:25.317731" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.317774" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.198962" elapsed="0.118847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.318018" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.317885" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.317867" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.318527" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.318850" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.318920" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.198258" elapsed="0.120784"/>
</kw>
<msg time="2026-04-07T17:18:25.319134" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.319177" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.193600" elapsed="0.125612"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.319528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.319285" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.319268" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:25.193442" elapsed="0.126185"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:24.925917" elapsed="0.393739"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:24.923478" elapsed="0.396230"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:24.918951" elapsed="0.400812"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:24.918540" elapsed="0.401275"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:24.915866" elapsed="0.404003"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:25.327844" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:18:25.324304" elapsed="0.003577">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:18:24.915295" elapsed="0.412741">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t22" name="Verify Port Is Modified After Fail" line="114">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:25.331082" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:25.330810" 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-07T17:18:25.332315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.332191" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.332173" 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-07T17:18:25.336844" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.336739" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.336722" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.337961" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:25.337579" elapsed="0.000430"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.338464" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:25.338164" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:25.338532" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:25.338684" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:25.337140" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.343841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.343735" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.343716" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.345114" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.345006" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.344962" elapsed="0.000257"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.345728" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.345359" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.346171" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.345906" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.381644" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.346729" elapsed="0.035076"/>
</kw>
<msg time="2026-04-07T17:18:25.381990" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.382038" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.346352" elapsed="0.035720"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.443251" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.382624" elapsed="0.060846"/>
</kw>
<msg time="2026-04-07T17:18:25.443651" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.443697" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.382240" elapsed="0.061492"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.444077" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.443821" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.443796" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.444684" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.444319" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.445052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.444827" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.444810" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.445184" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.447468" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.448907" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.450324" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.446038" elapsed="0.004675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.445451" elapsed="0.005373"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.344683" elapsed="0.106240"/>
</kw>
<msg time="2026-04-07T17:18:25.451028" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.451072" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.344070" elapsed="0.107037"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.451294" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.451184" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.451165" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.451753" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.452148" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.452221" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.343403" elapsed="0.108925"/>
</kw>
<msg time="2026-04-07T17:18:25.452419" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.452461" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.339075" elapsed="0.113421"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.452811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.452570" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.452553" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:25.338924" elapsed="0.113987"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.458346" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.458239" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.458221" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.459589" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.459484" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.459466" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.460158" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.459792" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.460580" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.460340" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.493955" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.461145" elapsed="0.032992"/>
</kw>
<msg time="2026-04-07T17:18:25.494302" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.494347" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.460756" elapsed="0.033625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.556609" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.494926" elapsed="0.061867"/>
</kw>
<msg time="2026-04-07T17:18:25.556957" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.557027" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.494546" elapsed="0.062517"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.557353" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.557140" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.557120" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.557991" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.557609" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.558352" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.558138" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.558120" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.558482" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.560786" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:18:25.562251" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.563624" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.559351" elapsed="0.004676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.558765" elapsed="0.005375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.459187" elapsed="0.105051"/>
</kw>
<msg time="2026-04-07T17:18:25.564328" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.564371" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.458558" elapsed="0.105848"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.564586" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.564482" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.564463" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.565056" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.565410" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.565482" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.457889" elapsed="0.107699"/>
</kw>
<msg time="2026-04-07T17:18:25.565679" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.565723" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.453284" elapsed="0.112473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.566098" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.565831" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.565814" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:25.453146" elapsed="0.113052"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.572538" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.572431" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.572413" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.573789" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.573683" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.573665" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.574445" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.574084" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.574867" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.574623" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.606531" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.575467" elapsed="0.031647"/>
</kw>
<msg time="2026-04-07T17:18:25.607670" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.607789" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.575064" elapsed="0.032812"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.659391" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.609685" elapsed="0.050182"/>
</kw>
<msg time="2026-04-07T17:18:25.660125" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.660175" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.608469" elapsed="0.051743"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.660664" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.660344" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.660303" elapsed="0.000470"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.661397" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.660919" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.661763" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.661549" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.661530" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.661901" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.664496" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:18:25.666010" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.667431" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.662935" elapsed="0.004895"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.662282" elapsed="0.005662"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.573381" elapsed="0.094682"/>
</kw>
<msg time="2026-04-07T17:18:25.668165" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.668211" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.572749" elapsed="0.095497"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.668435" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.668327" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.668307" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.668935" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.669297" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.669383" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.572097" elapsed="0.097402"/>
</kw>
<msg time="2026-04-07T17:18:25.669599" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.669645" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.566451" elapsed="0.103230"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.670033" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.669760" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.669742" elapsed="0.000371"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:25.566319" elapsed="0.103819"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:25.338759" elapsed="0.331418"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:25.336388" elapsed="0.333854"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:25.331894" elapsed="0.338446"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.331486" elapsed="0.338906"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:25.328715" elapsed="0.341737"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:25.678549" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:25.674667" elapsed="0.003925">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:25.328249" elapsed="0.350513">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s1-s2-t23" name="Start Old Candidate Instance" line="118">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:25.682387" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:25.682122" 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-07T17:18:25.683638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.683527" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.683508" 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-07T17:18:25.692754" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.692466" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.692417" elapsed="0.000513"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.695412" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:25.694450" elapsed="0.001025"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.696552" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:25.695824" elapsed="0.000784"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:25.696704" elapsed="0.000071"/>
</return>
<msg time="2026-04-07T17:18:25.697091" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:25.693559" elapsed="0.003587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.705282" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.705172" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.705154" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.706610" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.706504" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.706486" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.707202" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.706820" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.707641" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.707386" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.739543" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.708218" elapsed="0.031510"/>
</kw>
<msg time="2026-04-07T17:18:25.739900" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.739947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.707820" elapsed="0.032177"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.787412" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.740552" elapsed="0.047067"/>
</kw>
<msg time="2026-04-07T17:18:25.787805" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.787851" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.740163" elapsed="0.047798"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.788304" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.788074" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.788053" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.788931" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.788544" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.789320" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.789094" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.789076" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.789452" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.791779" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:18:25.793249" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.794679" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.790319" elapsed="0.004773"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.789730" elapsed="0.005474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.706205" elapsed="0.089098"/>
</kw>
<msg time="2026-04-07T17:18:25.795394" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.795437" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.705507" elapsed="0.089965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.795653" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.795547" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.795529" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.796150" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.796484" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.796554" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.704821" elapsed="0.091838"/>
</kw>
<msg time="2026-04-07T17:18:25.796751" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.796794" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.698039" elapsed="0.098790"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.797179" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.796904" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.796887" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:25.697686" elapsed="0.099617"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.802647" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.802540" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.802521" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.803888" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.803783" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.803765" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.804514" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.804155" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.804935" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.804691" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.836736" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.805621" elapsed="0.031273"/>
</kw>
<msg time="2026-04-07T17:18:25.837091" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.837137" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.805211" elapsed="0.031960"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.881760" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.837756" elapsed="0.044193"/>
</kw>
<msg time="2026-04-07T17:18:25.882143" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.882188" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.837349" elapsed="0.044874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.882517" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.882300" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.882280" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.883143" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.882757" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.883497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.883287" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.883268" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.883627" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.885905" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:18:25.887368" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.888738" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.884458" elapsed="0.004682"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.883874" elapsed="0.005405"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.803485" elapsed="0.085894"/>
</kw>
<msg time="2026-04-07T17:18:25.889469" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.889513" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.802860" elapsed="0.086688"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.889731" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.889625" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.889606" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.890204" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.890530" elapsed="0.000065"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.890646" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.802201" elapsed="0.088553"/>
</kw>
<msg time="2026-04-07T17:18:25.890846" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.890889" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.797568" elapsed="0.093356"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.891275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.891029" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.891011" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:25.797432" elapsed="0.093944"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.896839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.896731" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.896712" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.898114" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.898006" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.897987" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:25.898672" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:25.898320" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.899131" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:25.898851" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.927710" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:25.899691" elapsed="0.028178"/>
</kw>
<msg time="2026-04-07T17:18:25.928076" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:25.928122" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.899313" elapsed="0.028844"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:25.976034" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:25.928706" elapsed="0.047521"/>
</kw>
<msg time="2026-04-07T17:18:25.976409" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:25.976456" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.928324" elapsed="0.048168"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.976808" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.976573" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.976552" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:25.977469" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:25.977077" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.977831" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.977616" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.977598" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:25.977963" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:25.980341" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:18:25.981847" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:25.983240" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:25.978815" elapsed="0.004815"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:25.978241" elapsed="0.005503"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:25.897691" elapsed="0.086153"/>
</kw>
<msg time="2026-04-07T17:18:25.983937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.984015" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.897070" elapsed="0.086982"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:25.984239" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:25.984131" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.984112" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.984704" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.985055" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.985128" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:25.896393" elapsed="0.089021"/>
</kw>
<msg time="2026-04-07T17:18:25.985510" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:25.985555" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.891627" elapsed="0.093963"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:25.985912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:25.985666" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.985649" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:25.891494" elapsed="0.094537"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:25.697273" elapsed="0.288787"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:25.691425" elapsed="0.294690"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:25.683231" elapsed="0.302940"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.682796" elapsed="0.303421"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:25.680045" elapsed="0.306224"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:18:25.990566" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-04-07T17:18:25.986500" elapsed="0.004105">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-04-07T17:18:25.679503" elapsed="0.311252">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t24" name="Check Shards Status After Recover" 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-07T17:18:25.994265" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:25.994006" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:25.995502" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:25.995393" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:25.995375" 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-07T17:18:26.000148" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.000041" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.000023" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.001254" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.000847" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.001736" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.001436" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:26.001804" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.001956" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.000478" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.007224" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.007117" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.007097" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.008491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.008386" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.008368" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.009066" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.008696" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.009518" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:26.009269" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.039234" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:26.010091" elapsed="0.029300"/>
</kw>
<msg time="2026-04-07T17:18:26.039560" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:26.039606" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.009698" elapsed="0.029942"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.091832" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:26.040206" elapsed="0.051830"/>
</kw>
<msg time="2026-04-07T17:18:26.092205" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:26.092250" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.039803" elapsed="0.052483"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.092576" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.092361" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.092341" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.093235" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.092816" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.093593" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.093385" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.093367" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:26.093725" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.096003" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:18:26.097464" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:26.098899" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.094555" elapsed="0.004763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:26.093988" elapsed="0.005443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:26.008085" elapsed="0.091443"/>
</kw>
<msg time="2026-04-07T17:18:26.099619" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.099662" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.007444" elapsed="0.092253"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:26.099879" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.099773" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.099754" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.100353" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.100679" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.100750" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:26.006763" elapsed="0.094092"/>
</kw>
<msg time="2026-04-07T17:18:26.100947" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.101019" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.002349" elapsed="0.098706"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.101384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.101139" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.101113" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:26.002214" elapsed="0.099270"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.106943" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.106836" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.106818" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.108224" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.108118" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.108099" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.108782" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.108427" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.109237" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:26.108960" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.141167" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:26.109798" elapsed="0.031539"/>
</kw>
<msg time="2026-04-07T17:18:26.141505" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:26.141550" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.109417" elapsed="0.032167"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.197854" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:26.142157" elapsed="0.055912"/>
</kw>
<msg time="2026-04-07T17:18:26.198237" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:26.198320" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.141750" elapsed="0.056608"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.198653" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.198435" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.198415" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.199295" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.198893" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.199651" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.199442" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.199423" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:26.199784" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.202110" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:18:26.203548" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:26.204937" elapsed="0.000344"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.200620" elapsed="0.004729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:26.200052" elapsed="0.005411"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:26.107788" elapsed="0.097774"/>
</kw>
<msg time="2026-04-07T17:18:26.205653" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.205696" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.107177" elapsed="0.098554"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:26.205913" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.205807" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.205789" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.206383" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.206708" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.206778" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:26.106498" elapsed="0.100386"/>
</kw>
<msg time="2026-04-07T17:18:26.207002" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.207050" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.101736" elapsed="0.105349"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.207404" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.207160" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.207143" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:26.101603" elapsed="0.105899"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.212914" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.212807" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.212788" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.214209" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.214103" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.214084" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.214818" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.214459" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.215261" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:26.215013" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.243781" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:26.215820" elapsed="0.028128"/>
</kw>
<msg time="2026-04-07T17:18:26.244163" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:26.244209" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.215440" elapsed="0.028804"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:26.292090" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:26.244797" elapsed="0.047480"/>
</kw>
<msg time="2026-04-07T17:18:26.292444" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:26.292489" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.244415" elapsed="0.048109"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.292816" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.292600" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.292581" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.293457" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.293088" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.293810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.293602" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.293584" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:26.293941" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.296285" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:18:26.297771" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:26.299178" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.294804" elapsed="0.004763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:26.294209" elapsed="0.005470"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:26.213773" elapsed="0.086005"/>
</kw>
<msg time="2026-04-07T17:18:26.299869" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.299912" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.213164" elapsed="0.086783"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:26.300146" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.300040" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.300021" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.300607" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.300997" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.301082" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:26.212468" elapsed="0.088723"/>
</kw>
<msg time="2026-04-07T17:18:26.301283" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:26.301326" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:26.207753" elapsed="0.093609"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.301678" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.301436" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.301419" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:26.207619" elapsed="0.094159"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.002049" elapsed="0.299757"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:25.999673" elapsed="0.302187"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:25.995107" elapsed="0.306808"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:25.994674" elapsed="0.307284"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:25.991747" elapsed="0.310300"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:18:26.322879" elapsed="0.000243"/>
</kw>
<msg time="2026-04-07T17:18:26.323170" 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-07T17:18:26.322272" elapsed="0.000948"/>
</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 [['topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.321803" elapsed="0.001491"/>
</kw>
<msg time="2026-04-07T17:18:26.323339" 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-07T17:18:26.313902" elapsed="0.009481"/>
</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-07T17:18:26.313516" elapsed="0.009939"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.323873" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.323625" elapsed="0.000291"/>
</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-07T17:18:26.328779" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.328406" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.329290" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.328958" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:26.329361" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.329511" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.328042" elapsed="0.001493"/>
</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-07T17:18:26.329683" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.330330" 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-07T17:18:26.330002" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.330951" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.330508" elapsed="0.000487"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.331384" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.331144" elapsed="0.000266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.335575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.334958" elapsed="0.000667"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:26.335685" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:26.336023" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.333629" elapsed="0.002453"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.382117" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.381721" elapsed="0.000424"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.382902" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.382632" elapsed="0.000361">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.383089" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.382305" elapsed="0.000808"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.383651" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.383270" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.383991" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:26.384160" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:26.383835" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.384578" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.384339" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.385570" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.385318" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.386074" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.385770" elapsed="0.000330"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.386409" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.386608" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.386775" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.386278" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.386146" elapsed="0.000716"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:26.386903" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.387075" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:26.384991" elapsed="0.002109"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.384688" elapsed="0.002445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.387299" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.387157" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.384669" elapsed="0.002709"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.387950" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.387514" elapsed="0.000478"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.388190" elapsed="0.000033"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.381119" elapsed="0.007205"/>
</kw>
<msg time="2026-04-07T17:18:26.388377" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.369639" elapsed="0.018790"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.400789" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.412088" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.423281" 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-07T17:18:26.423471" 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-07T17:18:26.423640" 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-07T17:18:26.424009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.423856" elapsed="0.000210"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:26.423841" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.424224" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.424386" 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-07T17:18:26.424545" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.423813" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.423714" elapsed="0.000907"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.424762" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.424835" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:26.424948" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:26.365627" elapsed="0.059360"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.426215" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.425964" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.426406" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.425632" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.426746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.426503" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.427293" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.427000" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.426826" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.426483" elapsed="0.000893"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.429568" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.427522" elapsed="0.002073"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:26.429647" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:26.429799" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.425314" elapsed="0.004509"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.431026" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.430777" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.431181" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.430452" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:26.431437" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.431275" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.431256" elapsed="0.000268"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.431665" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.431833" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.431897" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:26.433789" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.430135" elapsed="0.003680"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.435195" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.434930" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.435628" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.435388" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.457023" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.457460" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:26.457688" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.437636" elapsed="0.020080"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.435737" elapsed="0.022021"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.457933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.457784" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.435719" elapsed="0.022316"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.461524" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.459040" elapsed="0.002689"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.458810" elapsed="0.002955"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.458791" elapsed="0.002999"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.464181" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.462091" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.461846" elapsed="0.002414"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.461829" elapsed="0.002456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.464845" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.464446" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.465212" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.464942" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.465747" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.465451" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.465295" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.464924" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.466361" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.465998" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.466684" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.466457" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.467231" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.466919" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.466766" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.466438" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.467457" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.468259" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.467959" elapsed="0.000326"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.468435" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.458390" elapsed="0.012220"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.470785" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.470679" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.470660" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.476498" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.471007" elapsed="0.005521"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.476580" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:26.476738" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.434134" elapsed="0.042630"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.476827" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:26.477040" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.345149" elapsed="0.131944"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.477567" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.477260" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.477211" elapsed="0.000524"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.477822" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:26.340249" elapsed="0.137828"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.336290" elapsed="0.141863"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.336270" elapsed="0.141939"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.479264" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.479064" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:26.479572" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.479379" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.479004" elapsed="0.000710"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.480630" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:26.480815" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:26.478465" elapsed="0.002409"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.482125" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.481198" elapsed="0.000987"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.483958" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.482482" elapsed="0.001608"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.491167" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.490897" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.491660" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.491413" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.502462" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.502520" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:26 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":128,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:18:24.836","LastApplied":322,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":322,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.382","active":true,"matchIndex":322,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":323},{"timeSinceLastActivity":"00:00:00.383","active":true,"matchIndex":322,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":323}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.077 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":86,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":32,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:26.502632" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.493885" elapsed="0.008772"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.491820" elapsed="0.010879"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.502873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.502725" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.491800" elapsed="0.011214"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.506230" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":128,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:18:24.836","LastApplied":322,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":322,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.382","active":true,"matchIndex":322,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":323},{"timeSinceLastActivity":"00:00:00.383","active":true,"matchIndex":322,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":323}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"1.077 ms","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":86,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":32,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.504074" elapsed="0.002214"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.503836" elapsed="0.002486"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.503817" elapsed="0.002530"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.508710" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.506617" elapsed="0.002137"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.506402" elapsed="0.002386"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.506385" elapsed="0.002427"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.509380" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.509005" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.509706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.509479" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.510254" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.509940" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.509788" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.509460" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.510850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.510492" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.511191" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.510945" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.511716" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.511425" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.511271" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.510927" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.511940" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.512728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.512458" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.512901" elapsed="0.002238"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.503418" elapsed="0.011783"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.515434" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.515326" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.515305" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.518455" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.515690" elapsed="0.002794"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.518619" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:18:26.518984" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.486204" elapsed="0.032833"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.519109" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:26.519434" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.484446" elapsed="0.035049"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.521662" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.520821" elapsed="0.000894"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:26.521779" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:26.522155" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:26.519927" elapsed="0.002288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.522869" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 322, 'CommittedTransactionsCount': 86, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, ...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.522507" elapsed="0.000422"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.523675" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.523279" elapsed="0.000456"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:26.523958" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:18:26.524129" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:26.332586" elapsed="0.191567"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:26.524212" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:26.524355" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:18:26.331817" elapsed="0.192561"/>
</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-07T17:18:26.524666" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.524456" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:18:26.524958" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.524746" elapsed="0.000494"/>
</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-07T17:18:26.525408" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.525265" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.524438" elapsed="0.001044"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:26.331652" elapsed="0.193854"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.529596" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.528959" elapsed="0.000688"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:26.529705" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:26.530112" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.527580" elapsed="0.002591"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.577032" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.576625" elapsed="0.000472"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.577806" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.577589" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.577960" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.577260" elapsed="0.000740"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.578545" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.578161" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.578858" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:26.579006" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:26.578725" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.579425" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.579184" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.580405" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.580149" elapsed="0.000301"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.580865" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.580602" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.581239" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.581442" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.581607" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.581110" elapsed="0.000554"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.580958" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:26.581733" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.581889" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:26.579819" elapsed="0.002094"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.579536" elapsed="0.002407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.582126" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.581982" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.579516" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.582758" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.582338" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.582830" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.576022" elapsed="0.006929"/>
</kw>
<msg time="2026-04-07T17:18:26.583020" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.563931" elapsed="0.019142"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.594563" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.606124" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.617384" 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-07T17:18:26.617572" 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-07T17:18:26.617741" 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-07T17:18:26.618111" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.617957" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:26.617942" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.618325" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.618487" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.618649" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.617914" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.617816" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.618865" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.618939" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:26.619070" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:26.560041" elapsed="0.059054"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.620311" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.620070" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.620464" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.619724" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.620795" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.620558" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.621363" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.621074" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.620875" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.620539" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.623587" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.621590" elapsed="0.002023"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:26.623663" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.623814" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.619407" elapsed="0.004431"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.625103" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.624840" elapsed="0.000324">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.625255" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.624514" elapsed="0.000765"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:26.625483" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.625349" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.625330" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.625703" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.625868" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.625932" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:26.627821" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.624197" elapsed="0.003651"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.629241" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.628987" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.629670" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.629431" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.651053" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.651470" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:26.651694" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.631780" elapsed="0.019941"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.629779" elapsed="0.021983"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.651936" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.651788" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.629760" elapsed="0.022277"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.655502" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.653036" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.652790" elapsed="0.002951"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.652771" elapsed="0.002994"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.658158" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.656054" elapsed="0.002148"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.655821" elapsed="0.002415"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.655804" elapsed="0.002455"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.658782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.658412" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.659123" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.658878" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.659657" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.659360" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.659206" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.658859" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.660267" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.659892" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.660593" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.660366" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.661163" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.660825" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.660674" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.660345" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.661389" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.662177" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.661889" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.662354" elapsed="0.002097"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.652374" elapsed="0.012139"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.664687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.664582" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.664563" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.670453" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.664904" elapsed="0.005578"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.670533" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:26.670688" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.628161" elapsed="0.042553"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.670776" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:26.670949" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.539455" elapsed="0.131566"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.671481" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.671187" elapsed="0.000416"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.671139" elapsed="0.000509"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.671735" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:26.534550" elapsed="0.137438"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.530381" elapsed="0.141687"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.530362" elapsed="0.141763"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.673206" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.673003" elapsed="0.000283"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:26.673513" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.673321" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.672928" elapsed="0.000726"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.674565" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:18:26.674749" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:26.672378" elapsed="0.002431"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.676047" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.675123" elapsed="0.000986"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.677709" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.676401" elapsed="0.001370"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.684811" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.684565" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.685340" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.685096" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.694245" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.694302" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:26 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":322,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":322,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"380.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:26.694409" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.687386" elapsed="0.007048"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.685504" elapsed="0.008971"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.694645" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.694500" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.685484" elapsed="0.009246"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.698129" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":322,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":322,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"380.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.695799" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.695553" elapsed="0.002672"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.695534" elapsed="0.002716"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.700627" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.698524" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.698306" elapsed="0.002399"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.698289" elapsed="0.002441"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.701290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.700896" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.701615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.701388" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.702160" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.701848" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.701696" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.701369" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.702750" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.702393" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.703084" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.702845" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.703607" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.703317" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.703166" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.702827" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.703831" elapsed="0.000353"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.704612" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.704342" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.704785" elapsed="0.002319"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.695139" elapsed="0.012027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.707397" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.707290" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.707268" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.710251" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.707650" elapsed="0.002630"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.710385" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:18:26.710728" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.679863" elapsed="0.030944"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.710881" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:26.711222" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.678134" elapsed="0.033148"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.713403" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.712592" elapsed="0.000863"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:26.713517" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:26.713865" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:26.711706" elapsed="0.002219"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.714592" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 322, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.714232" elapsed="0.000421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.715380" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.714995" elapsed="0.000445"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:26.715659" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:26.715812" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:26.526678" elapsed="0.189158"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:26.715894" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:26.716057" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:26.525819" elapsed="0.190261"/>
</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="PASS" start="2026-04-07T17:18:26.716370" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.716159" elapsed="0.000474"/>
</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-07T17:18:26.716799" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.716657" 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-07T17:18:26.717052" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.716897" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.716141" elapsed="0.000987"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:26.525658" elapsed="0.191495"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.721162" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.720530" elapsed="0.000683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:26.721273" elapsed="0.000199"/>
</return>
<msg time="2026-04-07T17:18:26.721740" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.719206" elapsed="0.002592"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.767994" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.767597" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.768732" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.768512" elapsed="0.000286">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.768946" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.768185" elapsed="0.000804"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.769538" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.769154" elapsed="0.000411"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.769854" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:26.770004" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:26.769719" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.770425" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.770184" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.771408" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.771157" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.771870" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.771607" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.772228" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.772426" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.772592" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.772099" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.771947" elapsed="0.000731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:26.772720" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:26.772893" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:26.770823" elapsed="0.002096"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.770537" elapsed="0.002416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.773137" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.772991" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.770517" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.773772" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.773347" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.773846" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.766991" elapsed="0.006989"/>
</kw>
<msg time="2026-04-07T17:18:26.774036" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.755488" elapsed="0.018600"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.785544" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.796932" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.808230" 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-07T17:18:26.808424" 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-07T17:18:26.808594" 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-07T17:18:26.808984" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.808809" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:26.808793" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.809199" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.809361" 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-07T17:18:26.809520" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.808766" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.808667" elapsed="0.000931"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.809736" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.809810" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:26.809924" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:26.751540" elapsed="0.058409"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.811389" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.811153" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.811540" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.810592" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.811873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.811636" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.812414" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.812128" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.811953" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.811617" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.814661" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.812641" elapsed="0.002046"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:26.814737" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:26.814888" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.810277" elapsed="0.004634"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.816148" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.815860" elapsed="0.000365">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.816376" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.815536" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:26.816622" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.816479" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.816460" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.816876" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.817062" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.817129" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:26.819043" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:26.815222" elapsed="0.003847"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.820405" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.820162" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.820852" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.820594" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.840184" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.841124" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:26.841567" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.822865" elapsed="0.018761"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.820993" elapsed="0.020728"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.842143" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.841780" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.820960" elapsed="0.021378"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.848408" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.844584" elapsed="0.004105"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.844101" elapsed="0.004638"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.844056" elapsed="0.004718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.852122" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.849191" elapsed="0.002992"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.848865" elapsed="0.003365"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.848840" elapsed="0.003424"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.853041" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.852481" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.853501" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.853178" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.854268" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.853828" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.853615" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.853151" elapsed="0.001234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.855173" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.854648" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.855619" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.855306" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.856369" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.855941" elapsed="0.000464"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.855731" elapsed="0.000723"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.855280" elapsed="0.001205"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.856684" elapsed="0.000558"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.857792" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.857493" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.857979" elapsed="0.002121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.843137" elapsed="0.017026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.860338" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.860233" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.860214" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.867666" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.860548" elapsed="0.007150"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.867752" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:18:26.867922" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.819361" elapsed="0.048587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.868032" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:26.868234" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.730994" elapsed="0.137291"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.868800" elapsed="0.000521"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.868466" elapsed="0.001244"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.868413" elapsed="0.001421"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.870098" elapsed="0.000165"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:26.726068" elapsed="0.144747"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.722097" elapsed="0.148924"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.722076" elapsed="0.149080"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.873932" elapsed="0.000149"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.873442" elapsed="0.000741"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:26.874705" elapsed="0.000128"/>
</return>
<status status="PASS" start="2026-04-07T17:18:26.874262" elapsed="0.000675"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.873302" elapsed="0.001754"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.877253" elapsed="0.000128"/>
</kw>
<msg time="2026-04-07T17:18:26.877684" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:26.871880" elapsed="0.005940"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.880869" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.878596" elapsed="0.002448"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.884845" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.881720" elapsed="0.003304"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.892471" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.892208" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.892988" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.892714" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:26.903024" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:26.903089" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:26 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:26 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Follower","LastApplied":322,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":322,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"461.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:26.903196" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:26.895132" elapsed="0.008090"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.893149" elapsed="0.010115"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.903442" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.903291" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.893128" elapsed="0.010403"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.909060" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":321,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":321,"Leader":"member-1-shard-topology-operational","LastIndex":322,"RaftState":"Follower","LastApplied":322,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":322,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"461.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":322,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":92837},"timestamp":1775582306,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.904665" elapsed="0.004532"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.904391" elapsed="0.004883"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.904373" elapsed="0.004957"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.914731" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.909938" elapsed="0.004893"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.909454" elapsed="0.005454"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.909416" elapsed="0.005548"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.916638" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.915346" elapsed="0.001358"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.917362" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.916869" elapsed="0.000572"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.917937" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.917623" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.917467" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.916831" elapsed="0.001208"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.918565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.918194" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.918891" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.918662" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.919443" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.919147" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.918989" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.918644" elapsed="0.000889"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.919686" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:26.920511" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.920209" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.920687" elapsed="0.002145"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:26.903951" elapsed="0.018943"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.923150" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:26.923041" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.923019" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:26.926096" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:26.923414" elapsed="0.002711"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:26.926228" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:18:26.926582" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:26.887440" elapsed="0.039225"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:26.926740" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:26.927086" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.885572" elapsed="0.041576"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.929315" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:26.928489" elapsed="0.000879"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:26.929437" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:26.929790" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:26.927584" elapsed="0.002267"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.930530" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 322, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.930165" elapsed="0.000427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:26.931329" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.930923" elapsed="0.000466"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:26.931613" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:26.931770" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:26.718324" elapsed="0.213470"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:26.931854" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:26.932028" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:26.717472" elapsed="0.214582"/>
</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="PASS" start="2026-04-07T17:18:26.932352" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.932136" elapsed="0.000497"/>
</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-07T17:18:26.932811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.932658" 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-07T17:18:26.933044" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.932889" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.932119" elapsed="0.001000"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:26.717310" elapsed="0.215833"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.331456" elapsed="0.601722"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.933225" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:26.933428" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:18:26.933474" level="INFO">${follower_list} = [2, 3]</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-07T17:18:26.327328" elapsed="0.606170"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.933943" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:18:26.934034" level="INFO">${leader_count} = 1</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-07T17:18:26.933672" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.934337" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:26.934127" elapsed="0.000272"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.934109" elapsed="0.000318"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.936492" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:18:26.934577" elapsed="0.001961"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:18:26.936959" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.936745" elapsed="0.000256"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.937050" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:18:26.324863" elapsed="0.612343"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:18:26.324648" elapsed="0.612607"/>
</iter>
<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-07T17:18:26.941823" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.941378" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.942331" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.942026" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:26.942401" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:26.942553" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.941006" 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-07T17:18:26.942729" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.943393" 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-07T17:18:26.943056" elapsed="0.000363"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.943810" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.943573" elapsed="0.000263"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.944232" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:26.943994" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.948349" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.947724" elapsed="0.000676"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:26.948460" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:26.948810" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:26.946370" elapsed="0.002501"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.995131" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:26.994720" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.995910" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:26.995654" elapsed="0.000414">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:26.996165" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:26.995321" elapsed="0.000869"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.996733" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:26.996350" elapsed="0.000433"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:26.997103" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:26.997264" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:26.996947" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.997723" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.997477" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.998717" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:26.998464" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:26.999202" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:26.998916" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.999535" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.999738" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:26.999906" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:26.999406" elapsed="0.000557"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:26.999274" elapsed="0.000736"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.000052" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.000211" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:26.998145" elapsed="0.002091"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.997835" elapsed="0.002433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.000434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.000292" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.997816" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.001113" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.000648" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.001187" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:26.994111" elapsed="0.007199"/>
</kw>
<msg time="2026-04-07T17:18:27.001363" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:26.982597" elapsed="0.018819"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.012882" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.024756" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.036036" 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-07T17:18:27.036225" 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-07T17:18:27.036395" 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-07T17:18:27.036759" elapsed="0.000070"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.036611" elapsed="0.000257"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:27.036597" elapsed="0.000295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.037044" 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-07T17:18:27.037210" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.037371" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.036569" elapsed="0.000855"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.036469" elapsed="0.000980"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.037588" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.037663" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:27.037777" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:26.978679" elapsed="0.059123"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.039049" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.038785" elapsed="0.000328">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.039203" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.038454" elapsed="0.000773"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.039538" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.039298" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.040076" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.039774" elapsed="0.000329"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.039618" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.039279" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.042331" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.040303" elapsed="0.002055"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:27.042413" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.042565" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.038136" elapsed="0.004453"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.043791" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.043551" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.043944" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.043222" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:27.044192" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.044057" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.044038" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.044415" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.044579" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.044644" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:27.046564" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.042886" elapsed="0.003705"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.048009" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.047750" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.048445" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.048200" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.060736" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.061395" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:27.061683" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.050465" elapsed="0.011256"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.048553" elapsed="0.013226"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.062044" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.061815" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.048535" elapsed="0.013630"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.067039" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.063544" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.063241" elapsed="0.004164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.063214" elapsed="0.004225"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.070413" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.067821" elapsed="0.002637"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.067517" elapsed="0.002975"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.067493" elapsed="0.003023"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.071052" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.070669" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.071376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.071148" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.071904" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.071610" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.071457" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.071129" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.072561" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.072155" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.072898" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.072658" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.073440" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.073149" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.072994" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.072640" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.073663" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.074444" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.074175" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.074615" elapsed="0.002133"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.062636" elapsed="0.014174"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.076999" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.076879" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.076860" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.082788" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.077207" elapsed="0.005611"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.082869" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:27.083040" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.046933" elapsed="0.036133"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.083127" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.083301" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:26.958122" elapsed="0.125228"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.083810" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.083514" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.083465" elapsed="0.000539"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.084096" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:26.953229" elapsed="0.131106"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:26.949099" elapsed="0.135312"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:26.949079" elapsed="0.135388"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.085543" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.085339" elapsed="0.000285"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:27.085852" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.085660" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.085280" elapsed="0.000737"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.086915" elapsed="0.000082"/>
</kw>
<msg time="2026-04-07T17:18:27.087130" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:27.084733" elapsed="0.002455"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.088434" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.087492" elapsed="0.001002"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.090260" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.088796" elapsed="0.001525"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.097236" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.096987" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.097718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.097477" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.106180" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.106239" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:27 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":22,"SnapshotIndex":91,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":91,"Leader":"member-1-shard-default-operational","LastIndex":95,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":92,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":95,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.462","active":true,"matchIndex":92,"voting":true,"id":"member-3-shard-default-operational","nextIndex":93},{"timeSinceLastActivity":"00:00:00.461","active":true,"matchIndex":92,"voting":true,"id":"member-2-shard-default-operational","nextIndex":93}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"449.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":92,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":26,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51573},"timestamp":1775582307,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:27.106344" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.099910" elapsed="0.006459"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.097876" elapsed="0.008535"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.106584" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.106436" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.097856" elapsed="0.008842"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.110066" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":22,"SnapshotIndex":91,"InMemoryJournalLogSize":4,"ReplicatedToAllIndex":91,"Leader":"member-1-shard-default-operational","LastIndex":95,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":92,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":95,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.462","active":true,"matchIndex":92,"voting":true,"id":"member-3-shard-default-operational","nextIndex":93},{"timeSinceLastActivity":"00:00:00.461","active":true,"matchIndex":92,"voting":true,"id":"member-2-shard-default-operational","nextIndex":93}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"449.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":92,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":26,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51573},"timestamp":1775582307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.107766" elapsed="0.002363"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.107555" elapsed="0.002608"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.107537" elapsed="0.002651"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.112554" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.110458" elapsed="0.002141"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.110244" elapsed="0.002388"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.110226" elapsed="0.002431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.113221" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.112834" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.113619" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.113318" elapsed="0.000384"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.114423" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.113963" elapsed="0.000498"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.113737" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.113300" elapsed="0.001245"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.115315" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.114767" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.115788" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.115455" elapsed="0.000415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.116581" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.116150" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.115905" elapsed="0.000764"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.115428" elapsed="0.001283"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.116923" elapsed="0.000523"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.118099" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.117678" elapsed="0.000459"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.118355" elapsed="0.003147"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.107135" elapsed="0.014457"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.121926" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.121772" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.121742" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.126072" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.122332" elapsed="0.003769"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.126243" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:18:27.126596" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.092408" elapsed="0.034240"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.126720" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:27.127072" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.090674" elapsed="0.036460"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.129461" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.128623" elapsed="0.000890"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:27.129576" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:18:27.129937" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:27.127570" elapsed="0.002446"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.130676" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 92, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.130311" elapsed="0.000427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.131481" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.131090" elapsed="0.000452"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:27.131766" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.131922" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:26.945470" elapsed="0.186476"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:27.132022" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.132169" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:18:26.944683" elapsed="0.187510"/>
</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-07T17:18:27.132483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.132272" elapsed="0.000267"/>
</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="PASS" start="2026-04-07T17:18:27.132774" elapsed="0.000245"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.132562" elapsed="0.000495"/>
</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-07T17:18:27.133247" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.133081" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.132255" elapsed="0.001069"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:26.944517" elapsed="0.188831"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.137386" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.136759" elapsed="0.000682"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:27.137501" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:27.137826" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:27.135401" elapsed="0.002483"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.186360" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.185957" elapsed="0.000433"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.187225" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.186944" elapsed="0.000362">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.187400" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.186607" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.187983" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.187585" elapsed="0.000426"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.188310" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:27.188469" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:27.188169" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.188896" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.188644" elapsed="0.000296"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.189890" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.189638" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.190374" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.190105" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.190725" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.190925" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.191113" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.190597" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.190453" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.191247" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.191407" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:27.189324" elapsed="0.002108"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.189031" elapsed="0.002433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.191629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.191488" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.189008" elapsed="0.002697"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.192289" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.191840" elapsed="0.000476"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.192363" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.185347" elapsed="0.007135"/>
</kw>
<msg time="2026-04-07T17:18:27.192537" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.172845" elapsed="0.019743"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.203983" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.215203" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.226380" 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-07T17:18:27.226569" 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-07T17:18:27.226740" 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-07T17:18:27.227110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.226957" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:27.226942" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.227325" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.227487" 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-07T17:18:27.227649" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.226913" elapsed="0.000788"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.226815" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.227866" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.227940" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:27.228080" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:27.167843" elapsed="0.060262"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.230260" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.229851" elapsed="0.000501">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.230479" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.229115" elapsed="0.001389"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.230888" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.230602" elapsed="0.000346"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.231505" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.231204" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.230995" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.230572" elapsed="0.001016"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.234007" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.231741" elapsed="0.002294"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:27.234090" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:18:27.234259" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.228422" elapsed="0.005862"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.235653" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.235413" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.235808" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.235082" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:27.236056" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.235903" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.235884" elapsed="0.000255"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.236280" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.236448" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.236514" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:27.238579" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.234722" elapsed="0.003885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.240029" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.239758" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.240461" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.240221" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.258070" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.258509" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:27.258712" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.242479" elapsed="0.016260"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.240569" elapsed="0.018212"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.258959" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.258807" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.240551" elapsed="0.018518"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.262571" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.260078" elapsed="0.002700"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.259847" elapsed="0.002965"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.259828" elapsed="0.003009"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.265225" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.263124" elapsed="0.002146"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.262892" elapsed="0.002411"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.262875" elapsed="0.002453"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.265889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.265487" elapsed="0.000429"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.266239" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.266002" elapsed="0.000310"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.266791" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.266491" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.266336" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.265982" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.267407" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.267044" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.267727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.267502" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.268272" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.267959" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.267808" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.267483" elapsed="0.000871"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.268502" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.269361" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.269042" elapsed="0.000345"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.269535" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.259429" elapsed="0.012304"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.271906" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.271802" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.271783" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.277768" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.272130" elapsed="0.005667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.277848" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.278045" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.238935" elapsed="0.039137"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.278133" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:27.278334" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.147232" elapsed="0.131152"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.278861" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.278555" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.278504" elapsed="0.000581"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.279191" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:27.142403" elapsed="0.137034"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.138111" elapsed="0.141407"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.138091" elapsed="0.141489"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.280683" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.280460" elapsed="0.000307"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:27.281016" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.280803" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.280400" elapsed="0.000762"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.282110" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:27.282296" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:27.279843" elapsed="0.002513"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.283604" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.282660" elapsed="0.001005"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.285307" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.283959" elapsed="0.001412"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.292482" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.292227" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.293005" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.292744" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.301833" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.301890" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:27 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":97,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":97,"Leader":"member-1-shard-default-operational","LastIndex":98,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":98,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":98,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"346.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":98,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51696},"timestamp":1775582307,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:27.302009" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.295093" elapsed="0.006943"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.293166" elapsed="0.008912"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.302249" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.302103" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.293145" elapsed="0.009188"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.308904" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":97,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":97,"Leader":"member-1-shard-default-operational","LastIndex":98,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":98,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":98,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"346.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":98,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51696},"timestamp":1775582307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.303804" elapsed="0.005212"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.303461" elapsed="0.005605"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.303436" elapsed="0.005664"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.312443" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.309485" elapsed="0.003021"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.309178" elapsed="0.003375"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.309154" elapsed="0.003432"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.313373" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.312829" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.313720" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.313492" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.314267" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.313954" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.313801" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.313474" elapsed="0.000875"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.314858" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.314501" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.315197" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.314953" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.315721" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.315429" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.315278" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.314935" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.315946" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.316744" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.316463" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.316918" elapsed="0.002122"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.302859" elapsed="0.016243"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.319330" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.319223" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.319203" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.322205" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.319582" elapsed="0.002652"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.322334" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:18:27.322679" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.287481" elapsed="0.035248"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.322834" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:27.323176" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.285723" elapsed="0.037512"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.325388" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.324551" elapsed="0.000890"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:27.325504" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:27.325857" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:27.323661" elapsed="0.002258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.326586" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 98, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.326229" elapsed="0.000418"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.327373" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.326987" elapsed="0.000446"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:27.327652" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.327809" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:27.134446" elapsed="0.193387"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:27.327891" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.328052" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:27.133676" elapsed="0.194400"/>
</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="PASS" start="2026-04-07T17:18:27.328366" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.328155" elapsed="0.000485"/>
</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-07T17:18:27.328804" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.328665" 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-07T17:18:27.329032" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.328882" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.328138" elapsed="0.000968"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:27.133512" elapsed="0.195618"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.333208" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.332547" elapsed="0.000711"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:27.333317" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:27.333638" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:27.331214" elapsed="0.002485"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.380599" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.380211" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.381377" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.381135" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.381572" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.380784" elapsed="0.000812"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.382151" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.381754" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.382469" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:27.382621" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:27.382332" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.383054" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.382797" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.384033" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.383761" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.384501" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.384232" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.384871" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.385088" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.385257" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.384742" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.384578" elapsed="0.000765"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.385388" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:27.385543" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:27.383449" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.383166" elapsed="0.002433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.385763" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.385623" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.383146" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.386420" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.385988" elapsed="0.000459"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.386495" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.379589" elapsed="0.007027"/>
</kw>
<msg time="2026-04-07T17:18:27.386670" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.368063" elapsed="0.018658"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.398216" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.409570" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.420893" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.421098" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.421270" 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-07T17:18:27.421630" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.421491" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:27.421476" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.421843" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.422023" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.422188" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.421446" elapsed="0.000796"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.421345" elapsed="0.000922"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.422406" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.422482" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:27.422597" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:27.364154" elapsed="0.058468"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.423835" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.423601" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.424002" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.423269" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.424338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.424100" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.424881" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.424592" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.424419" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.424080" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.427141" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.425125" elapsed="0.002042"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:27.427218" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.427369" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.422935" elapsed="0.004458"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.428587" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.428338" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.428776" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.428009" elapsed="0.000792"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:27.429024" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.428873" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.428854" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.429247" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.429414" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.429479" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:27.431372" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.427681" elapsed="0.003717"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.432781" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.432512" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.433228" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.432986" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.449751" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.450666" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:27.451137" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.435234" elapsed="0.015963"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.433338" elapsed="0.017952"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.451678" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.451348" elapsed="0.000473"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.433319" elapsed="0.018549"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.459729" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.454132" elapsed="0.006071"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.453627" elapsed="0.006656"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.453585" elapsed="0.006753"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.463377" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.461044" elapsed="0.002378"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.460463" elapsed="0.002993"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.460425" elapsed="0.003055"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.464019" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.463633" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.464346" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.464116" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.464884" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.464588" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.464426" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.464098" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.465500" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.465136" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.465823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.465596" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.466365" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.466074" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.465903" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.465578" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.466591" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.467378" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.467106" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.467552" elapsed="0.002243"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.452668" elapsed="0.017188"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.470046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.469924" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.469906" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.475789" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.470254" elapsed="0.005565"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.475871" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.476045" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.431699" elapsed="0.044373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.476135" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.476308" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.343338" elapsed="0.133019"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.476834" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.476523" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.476473" elapsed="0.000554"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.477116" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:27.338162" elapsed="0.139195"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.333907" elapsed="0.143527"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.333888" elapsed="0.143603"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.478566" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.478362" elapsed="0.000285"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:18:27.478876" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.478683" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.478301" elapsed="0.000737"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.479947" elapsed="0.000070"/>
</kw>
<msg time="2026-04-07T17:18:27.480148" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:27.477749" elapsed="0.002459"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.481482" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.480512" elapsed="0.001031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.483177" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.481837" elapsed="0.001401"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.490431" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.490180" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.490922" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.490676" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.499235" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.499292" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:27 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-default-operational","LastIndex":98,"RaftState":"Follower","LastApplied":98,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":98,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"285.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":98,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51696},"timestamp":1775582307,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:27.499393" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.492984" elapsed="0.006434"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.491096" elapsed="0.008365"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.499634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.499486" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.491076" elapsed="0.008643"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.503229" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-default-operational","LastIndex":98,"RaftState":"Follower","LastApplied":98,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":98,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"285.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":98,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":51696},"timestamp":1775582307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.500820" elapsed="0.002469"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.500567" elapsed="0.002758"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.500548" elapsed="0.002801"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.505878" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.503626" elapsed="0.002315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.503405" elapsed="0.002603"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.503388" elapsed="0.002656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.506773" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.506263" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.507285" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.506909" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.508051" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.507612" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.507399" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.506883" elapsed="0.001285"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.508898" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.508380" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.509371" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.509054" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.510130" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.509701" elapsed="0.000465"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.509484" elapsed="0.000731"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.509027" elapsed="0.001218"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.510449" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.511541" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.511166" elapsed="0.000410"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.511784" elapsed="0.002957"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.500136" elapsed="0.014691"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.515176" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.515026" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.514995" elapsed="0.000276"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.518700" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.515532" elapsed="0.003196"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.518830" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:18:27.519190" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.485370" elapsed="0.033870"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.519346" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:27.519675" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.483589" elapsed="0.036145"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.521850" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.521083" elapsed="0.000819"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:27.521963" elapsed="0.000077"/>
</return>
<msg time="2026-04-07T17:18:27.522331" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558230...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:27.520181" elapsed="0.002211"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.523048" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 98, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.522679" elapsed="0.000431"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.523827" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.523442" elapsed="0.000443"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:27.524126" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.524281" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:27.330325" elapsed="0.193980"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:27.524361" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.524503" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:27.329459" elapsed="0.195077"/>
</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="PASS" start="2026-04-07T17:18:27.524827" elapsed="0.000242"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.524615" elapsed="0.000493"/>
</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-07T17:18:27.525276" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.525133" 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-07T17:18:27.525487" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.525353" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.524597" elapsed="0.000962"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:27.329292" elapsed="0.196291"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.944310" elapsed="0.581303"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:27.525652" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.525850" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:18:27.525896" level="INFO">${follower_list} = [2, 3]</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-07T17:18:26.940266" elapsed="0.585653"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.526372" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:18:27.526447" level="INFO">${leader_count} = 1</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-07T17:18:27.526104" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.526745" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.526537" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.526520" elapsed="0.000306"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.528951" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:18:27.526955" elapsed="0.002059"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:18:27.529400" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.529212" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:27.529477" 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="PASS" start="2026-04-07T17:18:26.937570" elapsed="0.592059"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:18:26.937347" elapsed="0.592328"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:18:26.324523" elapsed="1.205183"/>
</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="PASS" start="2026-04-07T17:18:26.324144" elapsed="1.205618"/>
</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-07T17:18:27.534736" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.534357" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.535237" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:27.534918" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:27.535308" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:27.535458" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.533992" 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-07T17:18:27.535631" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.536284" 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-07T17:18:27.535941" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.536713" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:27.536463" elapsed="0.000275"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.537131" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:27.536881" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.541207" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.540593" elapsed="0.000671"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:27.541324" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:18:27.541647" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:27.539246" elapsed="0.002459"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.588241" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.587848" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.589031" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.588763" elapsed="0.000334">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.589190" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.588425" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.589752" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.589372" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.590082" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:27.590245" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:27.589933" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.590667" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.590423" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.591650" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.591398" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.592122" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.591845" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.592453" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.592661" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.592828" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.592326" elapsed="0.000558"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.592195" elapsed="0.000718"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.592955" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:27.593128" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:27.591080" elapsed="0.002072"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.590780" elapsed="0.002403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.593348" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.593207" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.590760" elapsed="0.002663"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.593995" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.593563" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.594071" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.587249" elapsed="0.006944"/>
</kw>
<msg time="2026-04-07T17:18:27.594246" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.575762" elapsed="0.018535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.605690" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.617019" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.628165" 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-07T17:18:27.628385" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.628580" elapsed="0.000023"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.628936" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.628799" elapsed="0.000208"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:27.628784" elapsed="0.000247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.629169" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.629333" 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-07T17:18:27.629493" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.628756" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.628657" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.629711" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.629786" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:27.629901" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:27.571740" elapsed="0.058186"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.631151" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.630900" elapsed="0.000313">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.631302" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.630569" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.631636" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.631397" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.632178" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.631872" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.631716" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.631378" elapsed="0.000882"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.634418" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.632404" elapsed="0.002040"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:27.634493" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.634643" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.630252" elapsed="0.004415"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.635849" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.635617" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.636016" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.635290" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:27.636246" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.636112" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.636093" elapsed="0.000235"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.636467" elapsed="0.000035"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.636690" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.636756" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:27.638639" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.634958" elapsed="0.003707"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.640020" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.639760" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.640450" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.640212" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.652820" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.653802" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:27.654285" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.642466" elapsed="0.011886"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.640581" elapsed="0.013866"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.654837" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.654505" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.640562" elapsed="0.014499"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.662127" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.657308" elapsed="0.005026"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.656802" elapsed="0.005567"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.656759" elapsed="0.005635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.664752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.662665" elapsed="0.002131"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.662449" elapsed="0.002381"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.662432" elapsed="0.002422"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.665392" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.665022" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.665714" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.665487" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.666258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.665945" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.665794" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.665468" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.666848" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.666491" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.667184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.666943" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.667705" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.667415" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.667264" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.666925" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.667926" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.668728" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.668439" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.668900" elapsed="0.002127"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.655816" elapsed="0.015273"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.671263" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.671158" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.671140" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.677059" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.671467" elapsed="0.005621"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.677140" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.677295" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.638959" elapsed="0.038362"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.677381" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.677554" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.551242" elapsed="0.126362"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.678089" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.677770" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.677720" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.678352" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:27.546371" elapsed="0.132220"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.541913" elapsed="0.136756"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.541892" elapsed="0.136834"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:27.679784" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.679585" elapsed="0.000307"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.680050" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.679930" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.679526" elapsed="0.000638"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.681107" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:27.681292" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:27.678998" elapsed="0.002353"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.682588" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.681654" elapsed="0.000995"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.684361" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.682942" elapsed="0.001480"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.691785" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.691537" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.692285" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.692041" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.702041" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.702123" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:27 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":12,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":59,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":59,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.021","active":true,"matchIndex":59,"voting":true,"id":"member-2-shard-topology-config","nextIndex":60},{"timeSinceLastActivity":"00:00:00.022","active":true,"matchIndex":59,"voting":true,"id":"member-3-shard-topology-config","nextIndex":60}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"689.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582307,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:27.702269" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.694493" elapsed="0.007811"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.692448" elapsed="0.009914"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.702609" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.702398" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.692425" elapsed="0.010302"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.707470" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":12,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":59,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":59,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.021","active":true,"matchIndex":59,"voting":true,"id":"member-2-shard-topology-config","nextIndex":60},{"timeSinceLastActivity":"00:00:00.022","active":true,"matchIndex":59,"voting":true,"id":"member-3-shard-topology-config","nextIndex":60}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"689.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":18,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.704263" elapsed="0.003291"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.703940" elapsed="0.003663"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.703914" elapsed="0.003724"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.711007" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.708041" elapsed="0.003030"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.707715" elapsed="0.003404"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.707692" elapsed="0.003461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.711884" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.711370" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.712359" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.712042" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.713159" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.712722" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.712504" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.712015" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.713857" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.713485" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.714194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.713952" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.714714" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.714424" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.714274" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.713934" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.714937" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.715723" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.715453" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.715896" elapsed="0.002154"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.703356" elapsed="0.014757"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.718342" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.718236" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.718215" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.721265" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.718599" elapsed="0.002694"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.721394" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:18:27.721774" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.686712" elapsed="0.035112"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.721896" elapsed="0.000059"/>
</return>
<msg time="2026-04-07T17:18:27.722234" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.684787" elapsed="0.037507"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.724408" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582307, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.723595" elapsed="0.000891"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:27.724550" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:27.724904" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582307, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:27.722719" elapsed="0.002246"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.725638" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 59, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.725272" elapsed="0.000427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.726423" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.726040" elapsed="0.000441"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:27.726704" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.726858" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:27.538320" elapsed="0.188562"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:27.726939" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:27.727100" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:18:27.537561" elapsed="0.189563"/>
</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-07T17:18:27.727411" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.727202" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:18:27.727691" elapsed="0.000221"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.727492" elapsed="0.000458"/>
</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-07T17:18:27.728132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.727989" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.727185" elapsed="0.001022"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:27.537400" elapsed="0.190830"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.733507" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.731621" elapsed="0.001936"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:27.733617" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:18:27.733940" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:27.730301" elapsed="0.003743"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.780216" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.779821" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.781035" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.780790" elapsed="0.000340">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.781243" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.780400" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.781816" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.781428" elapsed="0.000415"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.782150" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:27.782285" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:27.782011" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.782702" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.782459" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.783678" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.783425" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.784160" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.783875" elapsed="0.000311"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.784502" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.784700" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.784866" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.784363" elapsed="0.000559"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.784233" elapsed="0.000718"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.785011" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.785168" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:27.783111" elapsed="0.002081"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.782813" elapsed="0.002411"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.785388" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.785248" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.782794" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.786037" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.785598" elapsed="0.000467"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.786113" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.779221" elapsed="0.007012"/>
</kw>
<msg time="2026-04-07T17:18:27.786284" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.767720" elapsed="0.018615"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.797925" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.809186" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.820454" 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-07T17:18:27.820641" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.820814" 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-07T17:18:27.821186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.821047" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:27.821032" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.821398" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.821561" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.821721" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.821002" elapsed="0.000773"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.820889" elapsed="0.000912"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.821941" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.822032" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:18:27.822149" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:27.763822" elapsed="0.058352"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.823383" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.823147" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.823535" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.822799" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.823868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.823628" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.824433" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.824121" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.823949" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.823610" elapsed="0.000907"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.826670" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.824662" elapsed="0.002034"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:27.826746" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:27.826897" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.822483" elapsed="0.004438"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.828178" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.827928" elapsed="0.000312">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.828331" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.827599" elapsed="0.000756"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:27.828571" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.828436" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.828417" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.828794" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.828958" elapsed="0.000036"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.829039" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:18:27.830921" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:27.827247" elapsed="0.003701"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.832335" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.832083" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.832783" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.832539" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.846654" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.847578" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:27.848067" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.834796" elapsed="0.013332"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.832894" elapsed="0.015329"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.848636" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.848281" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.832875" elapsed="0.015952"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.857006" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.851139" elapsed="0.006327"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.850611" elapsed="0.006934"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.850567" elapsed="0.007034"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.860359" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.858240" elapsed="0.002174"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.857727" elapsed="0.002723"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.857687" elapsed="0.002790"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.861031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.860634" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.861359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.861129" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.861888" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.861593" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.861440" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.861111" elapsed="0.000873"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.862497" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.862140" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.862817" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.862592" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.863361" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.863067" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.862898" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.862574" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.863590" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.864377" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.864104" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.864565" elapsed="0.002291"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.849618" elapsed="0.017301"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.867110" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.867004" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.866983" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.872723" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.867317" elapsed="0.005435"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.872804" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.872962" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.831259" elapsed="0.041744"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.873067" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:27.873239" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.743079" elapsed="0.130209"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.873749" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.873453" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.873403" elapsed="0.000514"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.874027" elapsed="0.000061"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:27.738225" elapsed="0.136041"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.734253" elapsed="0.140089"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.734233" elapsed="0.140165"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:27.875452" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:18:27.875254" elapsed="0.000305"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.875698" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.875597" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.875195" elapsed="0.000616"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.876755" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:27.876943" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:27.874653" elapsed="0.002364"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.878242" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.877321" elapsed="0.000982"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.880084" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.878596" elapsed="0.001550"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.887277" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.886841" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.887766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.887522" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:27.896631" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:27.896689" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:27 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:27 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":59,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":59,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"388.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582307,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:27.896801" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:27.889926" elapsed="0.006900"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.887925" elapsed="0.008943"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.897058" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.896893" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.887904" elapsed="0.009240"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.900404" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":59,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":59,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"388.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582307,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.898191" elapsed="0.002340"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.897956" elapsed="0.002611"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.897938" elapsed="0.002654"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.903720" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.900868" elapsed="0.002916"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.900648" elapsed="0.003183"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.900631" elapsed="0.003235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.904644" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.904110" elapsed="0.000571"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.905122" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.904779" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.905868" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.905454" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.905238" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.904753" elapsed="0.001252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.906724" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.906224" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.907196" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.906857" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.907929" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.907522" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.907310" elapsed="0.000726"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.906831" elapsed="0.001236"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.908270" elapsed="0.000488"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:27.909380" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.909002" elapsed="0.000413"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.909621" elapsed="0.003173"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:27.897541" elapsed="0.015342"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.913236" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:27.913085" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.913055" elapsed="0.000276"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:27.916187" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:27.913584" elapsed="0.002633"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:27.916319" elapsed="0.000141"/>
</return>
<msg time="2026-04-07T17:18:27.916785" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:27.882258" elapsed="0.034578"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.916908" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:18:27.917255" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.880510" elapsed="0.036805"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.919447" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582307, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.918644" elapsed="0.000854"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:27.919608" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:18:27.919984" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582307, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:27.917746" elapsed="0.002302"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.920714" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 59, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.920342" elapsed="0.000435"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:27.921517" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.921125" elapsed="0.000452"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:27.921801" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:27.921955" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:27.729413" elapsed="0.192587"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:27.922059" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:27.922203" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:27.728557" elapsed="0.193671"/>
</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="PASS" start="2026-04-07T17:18:27.922524" elapsed="0.000223"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.922313" elapsed="0.000473"/>
</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-07T17:18:27.922952" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.922810" 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-07T17:18:27.923186" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.923047" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.922295" elapsed="0.000963"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:27.728384" elapsed="0.194897"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.927345" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.926717" elapsed="0.000678"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:27.927454" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:27.927781" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:27.925272" elapsed="0.002569"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.974646" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:27.974267" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.975385" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:27.975174" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:27.975539" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:27.974832" elapsed="0.000731"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.976120" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:27.975724" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:27.976451" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:27.976583" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:27.976301" elapsed="0.000340"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.977056" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.976796" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.978036" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:27.977768" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.978497" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:27.978235" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.978829" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.979042" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.979212" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:27.978701" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:27.978570" elapsed="0.000727"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:27.979340" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:27.979496" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:27.977452" elapsed="0.002068"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.977168" elapsed="0.002383"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.979715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:27.979575" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.977149" elapsed="0.002641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:27.980388" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:27.979927" elapsed="0.000494"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:27.980473" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:27.973648" elapsed="0.006949"/>
</kw>
<msg time="2026-04-07T17:18:27.980649" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:27.962024" elapsed="0.018676"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:27.992216" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.003627" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.014919" 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-07T17:18:28.015121" 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-07T17:18:28.015294" 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-07T17:18:28.015688" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.015548" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:28.015533" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.015905" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.016086" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.016251" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.015504" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.015404" elapsed="0.000952"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.016499" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.016575" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:28.016688" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:27.957994" elapsed="0.058719"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.017926" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.017695" elapsed="0.000309">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.018095" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.017360" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.018428" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.018189" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.018951" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.018664" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.018508" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.018170" elapsed="0.000878"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.021216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.019194" elapsed="0.002048"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:28.021292" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:28.021442" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.017040" elapsed="0.004427"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.022647" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.022415" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.022798" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.022087" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:28.023040" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.022891" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.022872" elapsed="0.000249"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.023261" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.023426" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.023489" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:28.025506" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.021756" elapsed="0.003777"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.026886" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.026639" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.027335" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.027094" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.043019" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.043887" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:28.044377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.029358" elapsed="0.015081"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.027444" elapsed="0.017090"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.044925" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.044594" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.027425" elapsed="0.017722"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.053121" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.047434" elapsed="0.006161"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.046891" elapsed="0.006777"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.046848" elapsed="0.006851"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.056084" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.053992" elapsed="0.002138"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.053762" elapsed="0.002402"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.053745" elapsed="0.002443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.056720" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.056353" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.057065" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.056815" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.057593" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.057298" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.057146" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.056796" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.058200" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.057827" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.058522" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.058295" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.059063" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.058756" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.058606" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.058277" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.059288" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.060072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.059785" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.060246" elapsed="0.002144"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.045903" elapsed="0.016548"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.062622" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.062519" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.062501" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.068552" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.062828" elapsed="0.005753"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.068632" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:28.068787" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.025829" elapsed="0.042984"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.068874" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:28.069059" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:27.937196" elapsed="0.131913"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.069568" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.069273" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.069224" elapsed="0.000510"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.069821" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:27.932292" elapsed="0.137793"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:27.928068" elapsed="0.142095"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:27.928048" elapsed="0.142172"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:28.071279" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.071081" elapsed="0.000305"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.071531" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.071424" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.071022" elapsed="0.000622"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.072587" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:28.072773" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:28.070474" elapsed="0.002358"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.074080" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.073150" elapsed="0.000991"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.075763" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.074433" elapsed="0.001392"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.082797" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.082551" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.083473" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.083229" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.091875" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.091932" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:28 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Follower","LastApplied":59,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":59,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"262.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582308,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:28.092052" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.085537" elapsed="0.006541"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.083638" elapsed="0.008481"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.092299" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.092144" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.083617" elapsed="0.008769"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.095728" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":58,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":58,"Leader":"member-1-shard-topology-config","LastIndex":59,"RaftState":"Follower","LastApplied":59,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":59,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"262.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":59,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":2356},"timestamp":1775582308,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.093427" elapsed="0.002396"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.093216" elapsed="0.002643"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.093198" elapsed="0.002686"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.098640" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.096178" elapsed="0.002524"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.095941" elapsed="0.002809"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.095923" elapsed="0.002861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.099539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.099022" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.100019" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.099674" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.100781" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.100366" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.100135" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.099648" elapsed="0.001246"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.101631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.101129" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.102103" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.101765" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.102934" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.102523" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.102300" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.101739" elapsed="0.001340"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.103281" elapsed="0.000483"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.104418" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.104006" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.104662" elapsed="0.002392"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.092784" elapsed="0.014332"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.107345" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.107238" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.107218" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.110215" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.107598" elapsed="0.002646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.110343" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:18:28.110687" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.077961" elapsed="0.032776"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.110808" elapsed="0.000111"/>
</return>
<msg time="2026-04-07T17:18:28.111202" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.076190" elapsed="0.035072"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.113377" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.112579" elapsed="0.000850"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:28.113525" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:18:28.113878" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:28.111686" elapsed="0.002252"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.114603" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 59, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.114246" elapsed="0.000417"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.115389" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.115003" elapsed="0.000446"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:28.115668" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:28.115824" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:27.924378" elapsed="0.191471"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:28.115905" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:28.116161" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:27.923597" elapsed="0.192589"/>
</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="PASS" start="2026-04-07T17:18:28.116498" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.116265" elapsed="0.000500"/>
</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-07T17:18:28.116928" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.116789" 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-07T17:18:28.117159" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.117023" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.116248" elapsed="0.000984"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:27.923436" elapsed="0.193819"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:27.537205" elapsed="0.580078"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.117323" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:28.117519" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:18:28.117565" level="INFO">${follower_list} = [2, 3]</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-07T17:18:27.533278" elapsed="0.584310"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.118037" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:18:28.118114" level="INFO">${leader_count} = 1</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-07T17:18:28.117756" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.118415" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.118206" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.118188" elapsed="0.000303"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.120596" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:18:28.118624" elapsed="0.002018"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:18:28.121002" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.120801" elapsed="0.000227"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.121076" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:18:27.530730" elapsed="0.590498"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:18:27.530517" elapsed="0.590757"/>
</iter>
<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-07T17:18:28.125535" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.125159" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.126078" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:28.125755" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:28.126148" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:28.126301" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:28.124781" elapsed="0.001544"/>
</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-07T17:18:28.126472" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.127128" 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-07T17:18:28.126777" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.127543" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:28.127307" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.127945" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:28.127709" elapsed="0.000281"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.132020" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.131401" elapsed="0.000670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:28.132132" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:28.132465" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:28.130073" elapsed="0.002456"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.179400" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.179019" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.180150" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.179909" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.180320" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.179585" elapsed="0.000759"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.180881" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.180502" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.181219" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:28.181355" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:28.181078" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.181770" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.181530" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.182748" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.182499" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.183222" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.182943" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.183553" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.183749" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.183915" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.183426" elapsed="0.000614"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.183295" elapsed="0.000776"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:28.184114" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:28.184303" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:28.182185" elapsed="0.002145"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.181881" elapsed="0.002481"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.184534" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.184387" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.181862" elapsed="0.002747"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.185189" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.184745" elapsed="0.000471"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.185263" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:28.178402" elapsed="0.006983"/>
</kw>
<msg time="2026-04-07T17:18:28.185437" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.166735" elapsed="0.018754"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.198011" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.209373" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.220617" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.220806" 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-07T17:18:28.220989" 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-07T17:18:28.221347" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.221209" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:28.221193" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.221558" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.221720" 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-07T17:18:28.221880" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.221165" elapsed="0.000767"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.221066" elapsed="0.000891"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.222112" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.222221" elapsed="0.000018"/>
</return>
<msg time="2026-04-07T17:18:28.222339" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:28.162820" elapsed="0.059545"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.223579" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.223345" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.223731" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.223011" elapsed="0.000745"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.224079" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.223825" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.224634" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.224345" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.224161" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.223807" elapsed="0.000909"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.226869" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.224859" elapsed="0.002037"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:28.226946" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:28.227113" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.222680" elapsed="0.004458"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.228382" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.228131" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.228565" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.227777" elapsed="0.000813"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:28.228800" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.228664" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.228644" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.229041" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.229210" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.229275" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:28.231168" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.227453" elapsed="0.003742"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.232567" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.232320" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.233014" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.232757" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.243865" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.244293" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:28.244515" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.235019" elapsed="0.009523"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.233125" elapsed="0.011459"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.244758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.244610" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.233106" elapsed="0.011736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.248389" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.245837" elapsed="0.002788"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.245622" elapsed="0.003053"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.245603" elapsed="0.003107"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.252040" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.249114" elapsed="0.002990"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.248788" elapsed="0.003364"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.248764" elapsed="0.003423"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.252927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.252413" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.253404" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.253085" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.254166" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.253730" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.253518" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.253059" elapsed="0.001222"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.255012" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.254492" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.255465" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.255148" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.256253" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.255793" elapsed="0.000497"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.255582" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.255122" elapsed="0.001248"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.256568" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.257359" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.257085" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.257536" elapsed="0.002123"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.245198" elapsed="0.014523"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.259893" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.259789" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.259770" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.265484" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.260115" elapsed="0.005399"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.265565" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:28.265721" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.231493" elapsed="0.034253"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.265808" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:28.266000" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.142028" elapsed="0.124024"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.266513" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.266217" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.266168" elapsed="0.000513"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.266767" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:28.136852" elapsed="0.130169"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.132737" elapsed="0.134361"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.132717" elapsed="0.134437"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:28.268227" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.268007" elapsed="0.000331"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.268477" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.268375" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.267931" elapsed="0.000658"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.269500" elapsed="0.000054"/>
</kw>
<msg time="2026-04-07T17:18:28.269685" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:28.267406" elapsed="0.002337"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.270990" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.270056" elapsed="0.000997"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.272695" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.271361" elapsed="0.001395"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.280438" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.280174" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.280928" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.280682" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.289964" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.290037" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:28 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"553.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:28.290152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.283002" elapsed="0.007175"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.281105" elapsed="0.009115"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.290395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.290246" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.281084" elapsed="0.009397"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.293771" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.090","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"553.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.291569" elapsed="0.002262"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.291355" elapsed="0.002510"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.291337" elapsed="0.002553"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.296355" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.294176" elapsed="0.002224"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.293945" elapsed="0.002490"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.293928" elapsed="0.002531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.297223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.296676" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.297675" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.297358" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.298439" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.298021" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.297788" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.297332" elapsed="0.001223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.299444" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.298779" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.299939" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.299606" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.300732" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.300311" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.300078" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.299578" elapsed="0.001270"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.301068" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.302174" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.301769" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.302418" elapsed="0.003132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.290919" elapsed="0.014717"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.305957" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.305808" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.305779" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.309767" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.306344" elapsed="0.003452"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.309899" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:18:28.310324" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.275144" elapsed="0.035231"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.310448" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:28.310778" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.273125" elapsed="0.037713"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.313004" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.312177" elapsed="0.000881"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:28.313123" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:18:28.313479" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:28.311286" elapsed="0.002254"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.314209" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.313828" elapsed="0.000443"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.315001" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.314597" elapsed="0.000464"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:28.315395" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:18:28.315557" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:28.129182" elapsed="0.186400"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:28.315639" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:28.315784" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:18:28.128424" elapsed="0.187384"/>
</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-07T17:18:28.316118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.315887" elapsed="0.000324"/>
</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="PASS" start="2026-04-07T17:18:28.316444" elapsed="0.000228"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.316237" elapsed="0.000472"/>
</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-07T17:18:28.316875" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.316734" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.315869" elapsed="0.001080"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:28.128238" elapsed="0.188755"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.321160" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.320386" elapsed="0.000825"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:28.321284" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:18:28.321612" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:28.318990" elapsed="0.002681"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.368387" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.367962" elapsed="0.000453"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.369200" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.368947" elapsed="0.000321">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.369360" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.368577" elapsed="0.000807"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.369925" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.369543" elapsed="0.000409"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.370263" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:28.370400" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:28.370124" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.370824" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.370575" 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-07T17:18:28.371809" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.371556" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.372305" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.372022" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.372642" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.372841" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.373023" elapsed="0.000023"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.372514" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.372380" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:28.373154" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:28.373311" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:28.371238" elapsed="0.002097"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.370935" elapsed="0.002432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.373533" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.373392" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.370916" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.374190" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.373745" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.374266" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:28.367321" elapsed="0.007067"/>
</kw>
<msg time="2026-04-07T17:18:28.374442" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.355578" elapsed="0.018915"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.386157" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.397517" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.408816" 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-07T17:18:28.409018" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.409191" 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-07T17:18:28.409546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.409408" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:28.409393" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.409759" 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-07T17:18:28.409922" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.410100" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.409365" elapsed="0.000790"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.409266" elapsed="0.000914"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.410317" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.410391" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:28.410505" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:28.351667" elapsed="0.058864"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.411762" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.411526" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.411913" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.411179" elapsed="0.000758"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.412291" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.412023" elapsed="0.000326"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.412818" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.412529" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.412374" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.412003" elapsed="0.000896"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.415072" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.413060" elapsed="0.002038"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:28.415148" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:28.415300" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.410843" elapsed="0.004482"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.416577" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.416336" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.416731" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.415993" elapsed="0.000762"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:28.416958" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.416825" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.416807" elapsed="0.000251"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.417199" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.417365" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.417429" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:28.419322" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.415617" elapsed="0.003731"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.420718" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.420471" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.421168" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.420910" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.441613" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.442543" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:28.443019" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.423309" elapsed="0.019773"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.421277" elapsed="0.021899"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.443566" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.443235" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.421259" elapsed="0.022497"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.451694" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.446036" elapsed="0.006174"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.445524" elapsed="0.006768"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.445481" elapsed="0.006867"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.454869" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.452765" elapsed="0.002149"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.452477" elapsed="0.002471"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.452437" elapsed="0.002548"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.455525" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.455143" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.455856" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.455625" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.456416" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.456108" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.455938" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.455606" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.457029" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.456653" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.457352" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.457126" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.457878" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.457586" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.457434" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.457108" elapsed="0.000851"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.458120" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.458897" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.458624" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.459087" elapsed="0.002131"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.444557" elapsed="0.016722"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.461452" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.461349" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.461330" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.467216" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.461658" elapsed="0.005588"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.467297" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:28.467454" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.419645" elapsed="0.047836"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.467542" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:28.467714" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.331043" elapsed="0.136720"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.468260" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.467927" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.467878" elapsed="0.000550"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.468517" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:28.326127" elapsed="0.142631"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.321881" elapsed="0.146952"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.321861" elapsed="0.147029"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:28.469946" elapsed="0.000076"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.469750" elapsed="0.000321"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.470212" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.470108" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.469691" elapsed="0.000635"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.471238" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:28.471423" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:28.469165" elapsed="0.002316"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.472725" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.471787" elapsed="0.000998"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.474400" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.473104" elapsed="0.001357"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.481625" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.481372" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.482153" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.481868" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.492272" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.492329" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:28 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"408.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:28.492432" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.484292" elapsed="0.008165"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.482315" elapsed="0.010184"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.492675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.492528" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.482295" elapsed="0.010465"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.496142" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"408.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.493811" elapsed="0.002437"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.493601" elapsed="0.002683"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.493583" elapsed="0.002726"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.499561" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.496599" elapsed="0.003024"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.496365" elapsed="0.003305"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.496348" elapsed="0.003357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.500468" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.499920" elapsed="0.000586"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.500927" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.500605" elapsed="0.000426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.501820" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.501281" elapsed="0.000575"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.501065" elapsed="0.000841"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.500579" elapsed="0.001357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.502682" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.502179" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.503151" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.502814" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.503882" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.503476" elapsed="0.000441"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.503266" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.502790" elapsed="0.001225"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.504248" elapsed="0.000444"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.505136" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.504848" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.505308" elapsed="0.002106"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.493182" elapsed="0.014294"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.507705" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.507599" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.507579" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.510569" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.507959" elapsed="0.002638"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.510698" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:18:28.511063" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.476597" elapsed="0.034516"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.511184" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:18:28.511506" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.474812" elapsed="0.036753"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.513684" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.512890" elapsed="0.000845"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:28.513833" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:18:28.514204" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:28.512017" elapsed="0.002248"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.514911" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.514555" elapsed="0.000431"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.515702" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.515315" elapsed="0.000447"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:28.515998" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:28.516178" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:28.318091" elapsed="0.198112"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:28.516260" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:28.516404" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:28.317316" elapsed="0.199113"/>
</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="PASS" start="2026-04-07T17:18:28.516717" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.516507" elapsed="0.000517"/>
</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-07T17:18:28.517192" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.517050" 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-07T17:18:28.517406" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.517271" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.516490" elapsed="0.000989"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:28.317153" elapsed="0.200350"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.521551" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.520853" elapsed="0.000747"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:28.521659" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:18:28.522007" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:28.519510" elapsed="0.002559"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.568612" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.568234" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.569356" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.569137" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.569513" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.568795" elapsed="0.000741"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.570090" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.569693" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.570404" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:18:28.570538" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:18:28.570270" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.571007" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.570749" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.571984" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.571718" elapsed="0.000312"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.572457" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.572194" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.572797" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.573010" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.573181" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.572670" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.572534" elapsed="0.000732"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:18:28.573308" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:28.573461" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:18:28.571403" elapsed="0.002083"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.571119" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.573683" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.573542" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.571100" elapsed="0.002658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.574329" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.573892" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.574403" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:18:28.567610" elapsed="0.006913"/>
</kw>
<msg time="2026-04-07T17:18:28.574575" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.556126" elapsed="0.018500"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.586392" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.597992" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.609367" 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-07T17:18:28.609565" 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-07T17:18:28.609736" 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-07T17:18:28.610166" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.610025" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:28.610009" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.610379" 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-07T17:18:28.610540" 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-07T17:18:28.610705" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:18:28.609979" elapsed="0.000778"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.609863" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.610922" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.611011" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:18:28.611127" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:18:28.552214" elapsed="0.058945"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.612406" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.612164" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.612558" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.611795" elapsed="0.000787"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.612894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.612653" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.613437" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.613149" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.612990" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.612634" elapsed="0.000885"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.615670" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.613663" elapsed="0.002033"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:18:28.615745" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:28.615897" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.611477" elapsed="0.004444"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:18:28.617135" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.616886" elapsed="0.000310">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:18:28.617286" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:18:28.616560" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:18:28.617513" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.617380" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.617362" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.617735" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.617899" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.617964" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:28.619892" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:18:28.616245" elapsed="0.003673"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.621289" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.621044" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.621717" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.621479" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.638213" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.638657" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:18:28.639134" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.623715" elapsed="0.015479"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.621824" elapsed="0.017465"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.639681" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.639347" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.621806" elapsed="0.018065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.647783" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.642159" elapsed="0.006140"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.641648" elapsed="0.006732"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.641606" elapsed="0.006830"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.650883" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.648777" elapsed="0.002151"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.648554" elapsed="0.002408"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.648521" elapsed="0.002480"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.651528" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.651156" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.651855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.651628" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.652415" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.652116" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.651936" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.651607" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.653022" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.652649" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.653351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.653124" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.653878" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.653582" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.653431" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.653106" elapsed="0.000856"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.654138" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.654944" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.654664" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.655135" elapsed="0.002143"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.640682" elapsed="0.016658"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.657514" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.657409" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.657391" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.664500" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.657721" elapsed="0.006808"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.664581" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:28.664739" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.620238" elapsed="0.044526"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.664825" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:18:28.665021" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.531549" elapsed="0.133525"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.665540" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.665240" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.665191" elapsed="0.000519"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.665797" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:18:28.526512" elapsed="0.139542"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.522278" elapsed="0.143854"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.522259" elapsed="0.143929"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:18:28.667251" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.667052" elapsed="0.000305"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.667497" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.667395" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.666992" elapsed="0.000617"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.668541" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:18:28.668727" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:18:28.666443" elapsed="0.002343"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.670037" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.669103" elapsed="0.000996"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.671693" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.670391" elapsed="0.001362"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.678947" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.678696" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.679455" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.679211" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:28.688858" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:28.688915" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:18:28 GMT', 'Expires': 'Tue, 07 Apr 2026 16:18:28 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"306.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200} 
 </msg>
<msg time="2026-04-07T17:18:28.689036" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:28.681526" elapsed="0.007536"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.679618" elapsed="0.009486"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.689277" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.689130" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.679597" elapsed="0.009765"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.692869" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"306.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582308,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.690432" elapsed="0.002600"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.690218" elapsed="0.002865"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.690200" elapsed="0.002919"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.696636" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.693502" elapsed="0.003200"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.693198" elapsed="0.003555"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.693174" elapsed="0.003614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.697554" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.697030" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.698029" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.697690" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.698776" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.698358" elapsed="0.000455"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.698146" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.697664" elapsed="0.001228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.699636" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.699129" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.700148" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.699772" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.700812" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:28.700480" elapsed="0.000358"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.700265" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.699747" elapsed="0.001148"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.701053" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:28.701832" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.701559" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.702020" elapsed="0.002132"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:28.689760" elapsed="0.014455"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.704446" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.704339" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.704318" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:18:28.707328" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:18:28.704708" elapsed="0.002649"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:18:28.707459" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:18:28.707815" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:28.673944" elapsed="0.033921"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:28.707936" elapsed="0.000078"/>
</return>
<msg time="2026-04-07T17:18:28.708296" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:18:28.672182" elapsed="0.036175"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.710493" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:28.709682" elapsed="0.000863"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:18:28.710652" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:18:28.711032" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582308, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:18:28.708784" elapsed="0.002311"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.711754" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.711390" elapsed="0.000426"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.712583" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.712190" elapsed="0.000459"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:18:28.712875" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:28.713047" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:18:28.518613" elapsed="0.194459"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:18:28.713128" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:28.713273" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:18:28.517819" elapsed="0.195478"/>
</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="PASS" start="2026-04-07T17:18:28.713586" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:28.713373" elapsed="0.000482"/>
</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-07T17:18:28.714040" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.713880" 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-07T17:18:28.714256" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.714120" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.713356" elapsed="0.000974"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:28.517657" elapsed="0.196697"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.128039" elapsed="0.586346"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.714426" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:28.714633" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:18:28.714680" level="INFO">${follower_list} = [2, 3]</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-07T17:18:28.124061" elapsed="0.590642"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.715258" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:18:28.715334" level="INFO">${leader_count} = 1</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-07T17:18:28.714875" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.715635" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.715427" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.715408" elapsed="0.000303"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.717729" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:18:28.715935" elapsed="0.001840"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:18:28.718137" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.717934" elapsed="0.000228"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.718208" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:18:28.121579" elapsed="0.596784"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:18:28.121355" elapsed="0.597054"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:18:27.530391" elapsed="1.188050"/>
</for>
<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="PASS" start="2026-04-07T17:18:27.530005" elapsed="1.188490"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:18:26.304916" elapsed="2.413681"/>
</kw>
<arg>90s</arg>
<arg>1s</arg>
<arg>Check Ovsdb Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:18:26.304410" elapsed="2.414240"/>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="PASS" start="2026-04-07T17:18:26.302245" elapsed="2.416468"/>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:18:25.991149" elapsed="2.727702"/>
</test>
<test id="s1-s1-s2-t25" name="Check Entity Owner Status After Recover" line="126">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:28.722391" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:28.722131" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.723811" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.723702" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.723682" 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-07T17:18:28.728553" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.728447" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.728429" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.729603" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:28.729226" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.730099" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:28.729782" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:28.730168" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:28.730319" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:28.728840" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.735560" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.735452" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.735432" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.736837" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.736733" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.736715" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.737417" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.737065" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.737851" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:28.737598" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.770444" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:28.738426" elapsed="0.032189"/>
</kw>
<msg time="2026-04-07T17:18:28.770794" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:28.770840" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.738047" elapsed="0.032829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.834352" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:28.771480" elapsed="0.063090"/>
</kw>
<msg time="2026-04-07T17:18:28.834754" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:28.834801" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.771077" elapsed="0.063761"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.835172" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.834920" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.834898" elapsed="0.000434"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.835862" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.835471" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.836270" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.836056" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.836037" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:28.836402" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.838850" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.840328" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:28.841746" elapsed="0.000346"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:28.837285" elapsed="0.004877"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:28.836685" elapsed="0.005589"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:28.736431" elapsed="0.105944"/>
</kw>
<msg time="2026-04-07T17:18:28.842465" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:28.842509" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.735775" elapsed="0.106771"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:28.842728" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.842623" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.842604" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.843229" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.843561" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.843631" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:28.735115" elapsed="0.108624"/>
</kw>
<msg time="2026-04-07T17:18:28.843832" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:28.843876" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.730707" elapsed="0.113206"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.844274" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.844029" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.844010" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:28.730570" elapsed="0.113804"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.849557" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.849447" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.849429" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.850824" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.850718" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.850700" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.851421" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.851066" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.851891" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:28.851638" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.887627" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:28.852570" elapsed="0.035463"/>
</kw>
<msg time="2026-04-07T17:18:28.888413" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:28.888514" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.852184" elapsed="0.036412"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.950149" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:28.889846" elapsed="0.060498"/>
</kw>
<msg time="2026-04-07T17:18:28.950513" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:28.950559" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.888965" elapsed="0.061629"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.950893" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.950673" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.950653" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:28.951534" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:28.951166" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.951893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.951685" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.951666" elapsed="0.000366"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:28.952065" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:28.954516" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:18:28.955963" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:28.957371" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:28.953073" elapsed="0.004690"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:28.952317" elapsed="0.005561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:28.850419" elapsed="0.107572"/>
</kw>
<msg time="2026-04-07T17:18:28.958085" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:28.958129" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.849773" elapsed="0.108394"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:28.958351" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:28.958244" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.958224" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.958818" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.959162" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.959233" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:28.849114" elapsed="0.110263"/>
</kw>
<msg time="2026-04-07T17:18:28.959471" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:28.959513" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.844631" elapsed="0.114919"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:28.959867" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:28.959625" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.959607" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:28.844496" elapsed="0.115505"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.965016" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.964882" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.964863" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:28.966260" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:28.966153" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:28.966135" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:28.966822" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:28.966464" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:28.967260" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:28.967014" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:29.013403" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:28.967820" elapsed="0.045762"/>
</kw>
<msg time="2026-04-07T17:18:29.013753" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:29.013799" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.967441" elapsed="0.046393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:29.080759" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:29.014410" elapsed="0.066547"/>
</kw>
<msg time="2026-04-07T17:18:29.081152" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:29.081199" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:29.014019" elapsed="0.067218"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.081543" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:29.081317" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:29.081297" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.082180" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:29.081784" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.082547" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:29.082334" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:29.082316" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:29.082680" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:29.085035" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:18:29.086488" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:29.087936" elapsed="0.000381"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:29.083543" elapsed="0.004847"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:29.082943" elapsed="0.005561"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:28.965836" elapsed="0.122769"/>
</kw>
<msg time="2026-04-07T17:18:29.088698" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:29.088743" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.965230" elapsed="0.123551"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:29.089204" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:18:29.088859" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:29.088840" elapsed="0.000453"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.089682" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.090258" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.090335" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:28.964547" elapsed="0.125897"/>
</kw>
<msg time="2026-04-07T17:18:29.090538" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:29.090583" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.960260" elapsed="0.130361"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.090945" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:29.090697" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:29.090679" elapsed="0.000362"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:28.960123" elapsed="0.130942"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:28.730398" elapsed="0.360697"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:28.728088" elapsed="0.363066"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:28.723407" elapsed="0.367805"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:28.722803" elapsed="0.368456"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:28.719953" elapsed="0.371362"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:18:29.124780" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:29.124389" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.125287" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:29.124965" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:29.125356" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:29.125509" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:29.124021" elapsed="0.001513"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:29.130072" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:29.129873" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:29.130474" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.130247" elapsed="0.000337">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.130751" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.130941" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131118" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131282" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131463" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131625" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131802" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.131988" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.142098" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.142299" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.152129" 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-07T17:18:29.152321" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.152388" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.129333" elapsed="0.023171">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:29.152615" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:29.152659" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:29.128769" elapsed="0.023913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.152873" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:29.152764" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:29.152746" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:29.154252" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.155076" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:29.154615" elapsed="0.000488"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:29.155905" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:29.155630" elapsed="0.000302"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:29.155994" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:29.156144" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:29.155289" elapsed="0.000880"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.156692" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:29.156326" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.157283" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:29.156917" elapsed="0.000392"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:29.157697" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:29.170750" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:29.157472" elapsed="0.016164">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.174080" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.174459" 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-07T17:18:29.174820" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.175209" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.175583" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.175958" elapsed="0.000077"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.176566" 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-07T17:18:29.176939" elapsed="0.000072"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.177322" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:29.176289" elapsed="0.001150"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.176141" elapsed="0.001355"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.177801" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.177931" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.153693" elapsed="0.024507">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:29.178449" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:29.178544" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:29.153100" elapsed="0.025497"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:29.180193" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.179309" elapsed="0.001021">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:29.178777" elapsed="0.001695">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:29.178737" elapsed="0.001808">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.180599" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.128223" elapsed="0.052473">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.180920" 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-07T17:18:29.181109" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.181171" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:29.125827" elapsed="0.055443">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:29.181435" 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-07T17:18:29.181607" 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-07T17:18:29.181772" 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-07T17:18:29.181927" 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-07T17:18:29.182108" 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-07T17:18:29.182266" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:29.182325" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.123394" elapsed="0.059030">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:30.212309" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:30.211786" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:30.212825" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:30.212511" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:30.212899" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:18:30.213100" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:30.211399" 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-07T17:18:30.217675" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:30.217485" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:30.218100" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.217846" elapsed="0.000333">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.218341" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.218551" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.218708" elapsed="0.000019"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.218863" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.219126" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.219290" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.219480" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.219638" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.230344" elapsed="0.000070"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.230622" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.240339" 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-07T17:18:30.240531" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.240597" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.216938" elapsed="0.023787">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:30.240849" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:30.240895" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:30.216381" elapsed="0.024537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.241145" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:30.241022" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:30.241000" 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-07T17:18:30.242551" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:30.243246" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:30.242910" elapsed="0.000365"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:30.244241" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:30.243956" elapsed="0.000311"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:30.244314" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:30.244462" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:30.243466" elapsed="0.001020"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:30.245029" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:30.244645" elapsed="0.000410"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:30.245557" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:30.245210" elapsed="0.000373"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:30.245994" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:30.260062" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:30.245739" elapsed="0.017441">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.263718" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.264129" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.264502" 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-07T17:18:30.264862" 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-07T17:18:30.265270" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.265624" 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-07T17:18:30.266239" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.266609" 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-07T17:18:30.266958" elapsed="0.000073"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:30.265932" elapsed="0.001173"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.265776" elapsed="0.001389"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.267482" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.267615" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.242003" elapsed="0.025853">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:30.268138" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:30.268236" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:30.241360" elapsed="0.026929"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:30.269668" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.268934" elapsed="0.000869">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:30.268472" elapsed="0.001468">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:30.268431" elapsed="0.001612">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.270146" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.215824" elapsed="0.054541">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.270743" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.271133" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.271273" elapsed="0.000031"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:30.213424" elapsed="0.058108">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:30.271852" 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-07T17:18:30.272040" 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-07T17:18:30.272206" 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-07T17:18:30.272361" 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-07T17:18:30.272521" 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-07T17:18:30.272680" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:30.272740" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:30.210598" elapsed="0.062252">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:31.304992" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:31.304572" elapsed="0.000448"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:31.305484" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:31.305177" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:31.305553" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:18:31.305711" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:31.304202" elapsed="0.001533"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:31.310447" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:31.310264" elapsed="0.000209"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:31.310837" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.310619" elapsed="0.000279">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311083" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311283" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311439" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311599" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311777" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.311936" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.312126" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.312296" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.322098" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.322352" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.332074" 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-07T17:18:31.332264" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.332332" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.309716" elapsed="0.022723">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:31.332549" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:31.332592" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:31.309167" elapsed="0.023448"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.332807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:31.332697" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:31.332678" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:31.334174" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:31.334844" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:31.334531" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:31.335671" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:31.335409" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:31.335747" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:31.335893" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:31.335075" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:31.336459" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:31.336089" elapsed="0.000397"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:31.337004" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:31.336639" elapsed="0.000393"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:31.337403" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:31.348957" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:31.337189" elapsed="0.014688">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.352314" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.352694" 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-07T17:18:31.353085" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.353447" 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-07T17:18:31.353815" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.354199" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.354860" 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-07T17:18:31.355310" 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-07T17:18:31.355665" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:31.354579" elapsed="0.001204"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.354425" elapsed="0.001416"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.356172" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.356308" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.333622" elapsed="0.022926">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:31.356800" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:31.356896" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:31.333031" elapsed="0.023917"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:31.358406" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.357649" elapsed="0.000893">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:31.357163" elapsed="0.001540">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:31.357121" elapsed="0.001665">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.358890" elapsed="0.000106"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.308601" elapsed="0.050590">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.359575" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.359885" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.359946" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:31.306051" elapsed="0.054008">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:31.360221" 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-07T17:18:31.360393" 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-07T17:18:31.360556" 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-07T17:18:31.360713" 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-07T17:18:31.360873" 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-07T17:18:31.361044" elapsed="0.000060"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:31.361150" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:31.303554" elapsed="0.057694">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:32.393172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:32.392654" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:32.393697" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:32.393378" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:32.393771" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:18:32.393954" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:32.392265" elapsed="0.001727"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:32.398528" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:32.398313" elapsed="0.000241"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:32.399156" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.398701" elapsed="0.000532">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.399396" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.399601" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.399758" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.399923" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.400116" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.400278" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.400449" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.400606" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.410414" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.410628" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.420254" 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-07T17:18:32.420443" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.420574" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.397765" elapsed="0.022927">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:32.420803" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:32.420847" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:32.397214" elapsed="0.023656"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.421089" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:32.420957" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:32.420937" 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-07T17:18:32.422480" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:32.423170" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:32.422842" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:32.423981" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:32.423706" elapsed="0.000302"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:32.424055" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:32.424202" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:32.423376" elapsed="0.000850"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:32.424756" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:32.424380" elapsed="0.000402"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:32.425466" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:32.425113" elapsed="0.000381"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:32.425887" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:32.437443" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:32.425652" elapsed="0.014130">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.440058" 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-07T17:18:32.440295" 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-07T17:18:32.440520" 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-07T17:18:32.440744" 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-07T17:18:32.440989" 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-07T17:18:32.441210" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.441579" 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-07T17:18:32.441810" 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-07T17:18:32.442095" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:32.441405" elapsed="0.000765"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.441307" elapsed="0.000902"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.442398" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.442618" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.421902" elapsed="0.020918">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:32.443050" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:32.443125" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:32.421302" elapsed="0.021856"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:32.446590" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.443568" elapsed="0.003107">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:32.443274" elapsed="0.003490">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:32.443248" elapsed="0.003561">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.446881" elapsed="0.000027"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.396656" elapsed="0.050403">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.447235" 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-07T17:18:32.447395" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.447456" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:32.394294" elapsed="0.053259">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:32.447714" 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-07T17:18:32.447884" 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-07T17:18:32.448063" 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-07T17:18:32.448220" 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-07T17:18:32.448379" 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-07T17:18:32.448537" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:32.448597" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:32.391496" elapsed="0.057197">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:33.481098" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:33.480600" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:33.481614" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:33.481297" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:33.481689" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:18:33.481866" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:33.480125" 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-07T17:18:33.486503" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:33.486305" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:33.486916" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.486678" elapsed="0.000335">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.487178" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.487379" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.487533" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.487690" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.487867" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.488042" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.488216" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.488373" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.498285" elapsed="0.000032"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.498484" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.508182" 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-07T17:18:33.508371" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.508437" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.485687" elapsed="0.022865">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:33.508662" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:33.508705" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:33.485138" elapsed="0.023589"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.508986" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:33.508815" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:33.508795" 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-07T17:18:33.510379" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:33.511068" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:33.510742" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:33.511874" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:33.511610" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:33.511947" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:33.512112" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:33.511276" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:33.512654" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:33.512292" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:33.513232" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:33.512833" elapsed="0.000425"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:33.513641" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:33.525347" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:33.513415" elapsed="0.013691">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.527290" 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-07T17:18:33.527460" 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-07T17:18:33.527622" 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-07T17:18:33.527786" 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-07T17:18:33.527952" 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-07T17:18:33.528135" 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-07T17:18:33.528403" 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-07T17:18:33.528571" 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-07T17:18:33.528729" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:33.528278" elapsed="0.000504"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.528207" 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-07T17:18:33.528943" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.529021" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.509802" elapsed="0.019327">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:33.529244" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:33.529288" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:33.509205" elapsed="0.020106"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:33.529991" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.529650" elapsed="0.000403">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:33.529437" elapsed="0.000678">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:33.529418" elapsed="0.000730">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.530193" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.484582" elapsed="0.045710">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.530467" 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-07T17:18:33.530629" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.530692" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:33.482220" elapsed="0.048571">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:33.530953" 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-07T17:18:33.531146" 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-07T17:18:33.531311" 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-07T17:18:33.531466" 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-07T17:18:33.531627" 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-07T17:18:33.531785" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:33.531845" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:33.479371" elapsed="0.052572">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:34.563066" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:34.562639" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:34.563558" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:34.563251" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:34.563628" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:18:34.563787" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:34.562272" elapsed="0.001539"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:34.568533" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:34.568351" elapsed="0.000208"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:34.568920" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.568705" elapsed="0.000289">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.569157" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.569345" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.569499" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.569676" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.569852" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.570024" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.570200" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.570357" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.580190" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.580383" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.590235" 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-07T17:18:34.590426" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.590491" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.567803" elapsed="0.022796">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:34.590707" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:34.590749" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:34.567257" elapsed="0.023516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.590963" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:34.590853" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:34.590835" 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-07T17:18:34.592335" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:34.593012" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:34.592691" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:34.594017" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:34.593572" elapsed="0.000473"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:34.594130" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:34.594282" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:34.593218" elapsed="0.001088"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:34.594829" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:34.594463" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:34.595370" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:34.595024" elapsed="0.000372"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:34.595762" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:34.612173" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:34.595555" elapsed="0.019347">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.615339" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.615713" 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-07T17:18:34.616102" 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-07T17:18:34.616468" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.616838" 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-07T17:18:34.617230" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.617822" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.618236" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.618592" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:34.617542" elapsed="0.001168"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.617378" elapsed="0.001390"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.619099" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.619235" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.591783" elapsed="0.027692">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:34.619725" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:34.619823" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:34.591191" elapsed="0.028683"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:34.621296" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.620558" elapsed="0.000871">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:34.620088" elapsed="0.001533">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:34.620046" elapsed="0.001649">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.621866" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.566690" elapsed="0.055464">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.622399" 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-07T17:18:34.622562" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.622623" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:34.564186" elapsed="0.058536">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:34.622886" 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-07T17:18:34.623080" 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-07T17:18:34.623247" 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-07T17:18:34.623404" 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-07T17:18:34.623565" 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-07T17:18:34.623724" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:34.623785" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:34.561637" elapsed="0.062246">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:35.654765" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:35.654375" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:35.655271" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:35.654949" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:35.655341" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:35.655498" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:35.654000" elapsed="0.001522"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:35.660212" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:35.660031" elapsed="0.000207"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:35.660598" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.660385" elapsed="0.000273">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.660817" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.661017" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.661774" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.661936" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.662177" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.662341" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.662518" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.662679" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.672429" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.672621" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.682529" 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-07T17:18:35.682716" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.682783" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.659487" elapsed="0.023404">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:35.683018" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:35.683063" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:35.658917" elapsed="0.024168"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.683280" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:35.683166" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:35.683148" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:35.684637" elapsed="0.000206"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:35.685334" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:35.685006" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:35.686150" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:35.685872" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:35.686223" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:35.686369" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:35.685541" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:35.686907" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:35.686546" elapsed="0.000387"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:35.687453" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:35.687107" elapsed="0.000372"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:35.687835" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:35.700638" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:35.687632" elapsed="0.016168">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.704318" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.704700" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.705117" 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-07T17:18:35.705519" 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-07T17:18:35.705889" 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-07T17:18:35.706316" elapsed="0.000051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.706892" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.707295" 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-07T17:18:35.707646" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:35.706616" elapsed="0.001146"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.706467" elapsed="0.001352"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.708147" elapsed="0.000050"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.708283" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.684098" elapsed="0.024427">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:35.708774" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:35.708873" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:35.683489" elapsed="0.025436"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:35.710379" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.709699" elapsed="0.000739">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:35.709197" elapsed="0.001303">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:35.709148" elapsed="0.001383">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.710576" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.658371" elapsed="0.052303">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.710846" 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-07T17:18:35.711024" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.711087" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:35.655826" elapsed="0.055359">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:35.711383" 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-07T17:18:35.711558" 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-07T17:18:35.711724" 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-07T17:18:35.711880" 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-07T17:18:35.712055" 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-07T17:18:35.712216" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:35.712275" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:35.653376" elapsed="0.058997">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:36.743012" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:36.742511" elapsed="0.000534"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:36.743530" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:36.743214" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:36.743602" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:18:36.743780" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:36.742120" elapsed="0.001685"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:36.748339" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:36.748152" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:36.748770" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.748512" elapsed="0.000553">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.749245" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.749443" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.749600" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.749762" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.749943" elapsed="0.000039"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.750127" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.750305" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.750462" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.760327" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.760608" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.770259" 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-07T17:18:36.770450" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.770515" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.747602" elapsed="0.023032">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:36.770745" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:36.770788" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:36.747041" elapsed="0.023770"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.771030" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:36.770897" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:36.770877" 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-07T17:18:36.772403" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:36.773104" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:36.772776" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:36.773911" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:36.773649" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:36.773999" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:36.774149" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:36.773315" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:36.774688" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:36.774326" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:36.775225" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:36.774865" elapsed="0.000386"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:36.775631" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:36.788158" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:36.775404" elapsed="0.014507">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.790112" 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-07T17:18:36.790280" 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-07T17:18:36.790438" 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-07T17:18:36.790596" 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-07T17:18:36.790759" 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-07T17:18:36.790913" 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-07T17:18:36.791242" 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-07T17:18:36.791412" 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-07T17:18:36.791568" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:36.791116" elapsed="0.000505"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.791041" 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-07T17:18:36.791784" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.791842" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.771842" elapsed="0.020109">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:36.792082" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:36.792126" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:36.771245" elapsed="0.020905"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:36.793008" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.792443" elapsed="0.000627">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:36.792233" elapsed="0.000903">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:36.792215" elapsed="0.000954">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.793215" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.746480" elapsed="0.046833">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.793486" 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-07T17:18:36.793647" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.793708" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:36.744118" elapsed="0.049690">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:36.793987" 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-07T17:18:36.794163" 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-07T17:18:36.794359" 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-07T17:18:36.794516" 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-07T17:18:36.794675" 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-07T17:18:36.794834" elapsed="0.000058"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:36.794936" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:36.741359" elapsed="0.053692">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:37.826075" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:37.825560" elapsed="0.000550"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:37.826598" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:37.826281" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:37.826673" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:18:37.826856" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:37.825165" 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-07T17:18:37.831437" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:37.831247" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:37.831844" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.831610" elapsed="0.000305">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832091" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832310" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832464" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832621" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832795" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.832953" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.833140" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.833298" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.843285" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.843482" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.853208" 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-07T17:18:37.853402" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.853534" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.830698" elapsed="0.022953">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:37.853763" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:37.853806" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:37.830136" elapsed="0.023693"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.854045" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:37.853915" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:37.853895" 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-07T17:18:37.855415" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:37.856099" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:37.855774" elapsed="0.000363"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:37.856909" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:37.856650" elapsed="0.000285"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:37.856999" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:37.857146" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:37.856319" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:37.857691" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:37.857328" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:37.858226" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:37.857868" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:37.858629" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:37.871306" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:37.858406" elapsed="0.015554">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.874397" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.874770" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.875160" 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-07T17:18:37.875520" 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-07T17:18:37.875889" 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-07T17:18:37.876289" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.876869" 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-07T17:18:37.877280" 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-07T17:18:37.877629" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:37.876594" elapsed="0.001150"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.876441" elapsed="0.001361"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.878137" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.878271" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.854863" elapsed="0.023727">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:37.878844" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:37.878940" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:37.854265" elapsed="0.024757"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:37.880453" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.879675" elapsed="0.000911">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:37.879206" elapsed="0.001519">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:37.879166" elapsed="0.001629">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.880897" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.829577" elapsed="0.051574">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.881448" 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-07T17:18:37.881608" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.881669" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:37.827195" elapsed="0.054573">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:37.881929" 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-07T17:18:37.882116" 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-07T17:18:37.882280" 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-07T17:18:37.882441" 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-07T17:18:37.882600" 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-07T17:18:37.882758" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:37.882818" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:37.824383" elapsed="0.058532">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:38.914126" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:38.913642" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:38.914636" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:38.914325" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:38.914710" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:18:38.914878" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:38.913175" 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-07T17:18:38.919424" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:38.919236" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:38.919854" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.919597" elapsed="0.000327">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920108" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920311" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920465" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920622" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920798" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.920955" elapsed="0.000033"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.921142" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.921297" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.930932" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.931135" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.940795" 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-07T17:18:38.940996" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.941063" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.918686" elapsed="0.022490">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:38.941288" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:38.941331" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:38.918130" elapsed="0.023224"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.941595" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:38.941440" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:38.941420" 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-07T17:18:38.942982" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:38.943668" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:38.943340" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:38.944658" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:38.944391" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:38.944732" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:38.944879" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:38.943882" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:38.945446" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:38.945072" elapsed="0.000399"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:38.945986" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:38.945622" elapsed="0.000391"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:38.946398" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:38.957784" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:38.946171" elapsed="0.014755">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.961362" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.961739" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.962127" 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-07T17:18:38.962519" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.962890" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.963298" 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-07T17:18:38.963907" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.964311" 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-07T17:18:38.964657" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:38.963602" elapsed="0.001174"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.963450" elapsed="0.001384"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.965161" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.965296" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.942434" elapsed="0.023099">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:38.965783" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:38.965879" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:38.941812" elapsed="0.024118"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:38.967443" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.966706" elapsed="0.001012">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:38.966233" elapsed="0.001631">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:38.966190" elapsed="0.001746">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.968078" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.917571" elapsed="0.050730">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.968550" 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-07T17:18:38.968711" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.968773" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:38.915217" elapsed="0.053651">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:38.969044" 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-07T17:18:38.969217" 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-07T17:18:38.969381" 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-07T17:18:38.969537" 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-07T17:18:38.969699" 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-07T17:18:38.969857" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:38.969917" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:38.912424" elapsed="0.057604">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:40.000836" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:40.000291" elapsed="0.000579"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:40.001374" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:40.001056" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:40.001447" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:40.001624" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:39.999886" 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-07T17:18:40.006596" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:40.006402" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:40.007026" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:40.006771" elapsed="0.000341">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.007300" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.007504" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.007663" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.007824" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.008022" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.008186" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.008362" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.008521" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.018412" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.018607" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.028373" 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-07T17:18:40.028565" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.028632" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:40.005831" elapsed="0.022918">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:40.028862" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:40.028905" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:40.005267" elapsed="0.023662"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.029154" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:40.029036" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:40.029015" 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-07T17:18:40.030536" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:40.031280" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:40.030898" elapsed="0.000408"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:40.032123" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:40.031837" elapsed="0.000316"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:40.032245" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:40.032397" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:40.031491" elapsed="0.000931"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:40.032949" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:40.032577" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:40.033489" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:40.033145" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:40.033900" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:40.047852" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:40.033676" elapsed="0.016426">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.050357" 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-07T17:18:40.050592" 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-07T17:18:40.050814" 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-07T17:18:40.051080" 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-07T17:18:40.051348" 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-07T17:18:40.051573" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.051940" 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-07T17:18:40.052245" 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-07T17:18:40.052468" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:40.051767" elapsed="0.000776"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.051670" elapsed="0.000912"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.052770" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.052852" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:40.029988" elapsed="0.023053">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:40.053221" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:40.053285" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:40.029370" elapsed="0.023947"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:40.054232" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:40.053736" elapsed="0.000584">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:40.053434" elapsed="0.000976">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:40.053408" elapsed="0.001120">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.054601" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:40.004699" elapsed="0.050042">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.055064" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.055316" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.055404" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:40.002045" elapsed="0.053499">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.055771" 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-07T17:18:40.056034" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:40.056270" 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-07T17:18:40.056491" 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-07T17:18:40.056721" 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-07T17:18:40.056943" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:40.057050" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:39.999123" elapsed="0.058066">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:41.087356" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:41.086850" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:41.087870" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:41.087558" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:41.087945" elapsed="0.000059"/>
</return>
<msg time="2026-04-07T17:18:41.088137" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:41.086410" elapsed="0.001752"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:41.092719" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:41.092526" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:41.093139" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.092892" elapsed="0.000325">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.093604" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.093815" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.093984" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.094146" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.094393" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.094552" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.094737" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.094913" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.104743" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.104936" elapsed="0.000141"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.114885" 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-07T17:18:41.115089" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.115156" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.091989" elapsed="0.023289">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:41.115388" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:41.115431" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:41.091414" elapsed="0.024040"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.115657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:41.115541" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:41.115521" 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-07T17:18:41.117039" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:41.117714" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:41.117399" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:41.118531" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:41.118270" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:41.118604" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:41.118899" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:41.117920" elapsed="0.001008"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:41.119525" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:41.119148" elapsed="0.000403"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:41.120074" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:41.119704" elapsed="0.000396"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:41.120497" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:41.138823" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:41.120263" elapsed="0.020330">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.140811" 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-07T17:18:41.140999" 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-07T17:18:41.141165" 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-07T17:18:41.141336" 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-07T17:18:41.141506" 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-07T17:18:41.141668" 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-07T17:18:41.141933" 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-07T17:18:41.142119" 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-07T17:18:41.142279" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:41.141808" elapsed="0.000524"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.141737" 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-07T17:18:41.142496" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.142556" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.116489" elapsed="0.026183">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:41.142808" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:41.142853" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:41.115869" elapsed="0.027008"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:41.143507" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.143189" elapsed="0.000379">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:41.142960" elapsed="0.000670">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:41.142942" elapsed="0.000721">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.143709" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.090854" elapsed="0.052955">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.144000" 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-07T17:18:41.144165" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.144227" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:41.088463" elapsed="0.055863">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:41.144534" 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-07T17:18:41.144710" 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-07T17:18:41.144877" 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-07T17:18:41.145050" 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-07T17:18:41.145215" 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-07T17:18:41.145377" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:41.145439" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:41.085633" elapsed="0.059907">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:42.176539" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:42.176054" elapsed="0.000519"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:42.177066" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:42.176738" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:42.177139" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:42.177322" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:42.175654" 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-07T17:18:42.181941" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:42.181753" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:42.182376" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.182131" elapsed="0.000320">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.182614" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.182814" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.182985" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.183150" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.183327" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.183487" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.183660" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.183817" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.193691" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.193957" elapsed="0.000035"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.203730" 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-07T17:18:42.203922" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.204003" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.181206" elapsed="0.022913">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:42.204231" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:42.204275" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:42.180628" elapsed="0.023669"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.204497" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:42.204384" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:42.204363" 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-07T17:18:42.205864" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:42.206578" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:42.206263" elapsed="0.000340"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:42.207560" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:42.207133" elapsed="0.000454"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:42.207635" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:42.207799" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:42.206783" elapsed="0.001042"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:42.208372" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:42.208000" elapsed="0.000399"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:42.208902" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:42.208553" elapsed="0.000375"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:42.209338" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:42.221306" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:42.209103" elapsed="0.015679">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.225226" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.225603" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.225957" elapsed="0.000073"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.226365" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.226738" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.227127" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.227812" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.228228" 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-07T17:18:42.228744" elapsed="0.000060"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:42.227530" elapsed="0.001356"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.227371" elapsed="0.001576"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.229298" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.229433" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.205322" elapsed="0.024356">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:42.229929" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:42.230058" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:42.204709" elapsed="0.025403"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:42.231266" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.230883" elapsed="0.000444">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:42.230351" elapsed="0.001040">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:42.230304" elapsed="0.001120">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.231470" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.180085" elapsed="0.051485">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.231745" 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-07T17:18:42.231908" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.231984" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:42.177645" elapsed="0.054444">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.232259" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:42.232451" 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-07T17:18:42.232665" 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-07T17:18:42.232825" 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-07T17:18:42.233010" 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-07T17:18:42.233172" elapsed="0.000060"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:42.233277" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:42.174905" elapsed="0.058475">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:43.263936" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:43.263489" elapsed="0.000491"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:43.264463" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:43.264147" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:43.264537" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:18:43.264708" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:43.263108" elapsed="0.001624"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:43.269521" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:43.269334" elapsed="0.000212"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:43.269935" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.269694" elapsed="0.000327">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.270183" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.270380" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.270536" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.270697" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.270874" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.271049" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.271222" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.271379" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.281186" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.281379" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.291073" 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-07T17:18:43.291264" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.291394" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.268785" elapsed="0.022726">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:43.291624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:43.291667" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:43.268222" elapsed="0.023468"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.292020" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:43.291880" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:43.291858" 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-07T17:18:43.293389" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:43.294091" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:43.293752" elapsed="0.000365"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:43.294893" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:43.294631" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:43.294980" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:43.295131" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:43.294298" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:43.295674" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:43.295309" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:43.296227" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:43.295857" elapsed="0.000396"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:43.296634" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:43.310270" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:43.296410" elapsed="0.016130">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.312801" 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-07T17:18:43.313064" 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-07T17:18:43.313295" 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-07T17:18:43.313524" 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-07T17:18:43.313775" 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-07T17:18:43.314018" 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-07T17:18:43.314387" 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-07T17:18:43.314621" 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-07T17:18:43.314838" elapsed="0.000027"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:43.314213" elapsed="0.000696"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.314115" 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-07T17:18:43.315159" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.315240" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.292834" elapsed="0.022616">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:43.315610" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:43.315671" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:43.292236" elapsed="0.023468"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:43.316575" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.316138" elapsed="0.000520">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:43.315819" elapsed="0.000925">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:43.315794" elapsed="0.000994">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.316851" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.267660" elapsed="0.049348">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.317253" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.317477" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.317561" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:43.265048" elapsed="0.052649">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.317937" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:43.318200" 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-07T17:18:43.318430" 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-07T17:18:43.318648" 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-07T17:18:43.318871" 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-07T17:18:43.319109" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:43.319196" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:43.262400" elapsed="0.056939">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:44.351923" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:44.351411" elapsed="0.000548"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:44.352467" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:44.352148" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:44.352542" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:18:44.352727" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:44.350895" elapsed="0.001856"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:44.357315" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:44.357103" elapsed="0.000240"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:44.357728" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.357493" elapsed="0.000567">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.358229" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.358438" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.358595" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.358754" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.358929" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.359104" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.359276" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.359430" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.369116" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.369326" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.379026" 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-07T17:18:44.379247" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.379313" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.356553" elapsed="0.022883">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:44.379549" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:44.379592" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:44.355996" elapsed="0.023618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.379894" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:44.379706" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:44.379685" 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-07T17:18:44.381319" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:44.382009" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:44.381684" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:44.382828" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:44.382568" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:44.382900" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:44.383148" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:44.382232" elapsed="0.000942"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:44.383700" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:44.383333" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:44.384238" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:44.383879" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:44.384650" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:44.397674" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:44.384421" elapsed="0.015769">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.400445" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.400679" 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-07T17:18:44.400904" 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-07T17:18:44.401155" 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-07T17:18:44.401419" 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-07T17:18:44.401642" 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-07T17:18:44.402081" 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-07T17:18:44.402330" 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-07T17:18:44.402547" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:44.401842" elapsed="0.000778"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.401742" elapsed="0.000916"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.402846" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.402926" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.380743" elapsed="0.022369">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:44.403274" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:44.403334" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:44.380132" elapsed="0.023234"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:44.404302" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.403831" elapsed="0.000556">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:44.403535" elapsed="0.000937">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:44.403509" elapsed="0.001008">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.404581" elapsed="0.000305"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.355441" elapsed="0.049592">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.405294" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.405524" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.405610" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:44.353066" elapsed="0.052683">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.405997" 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-07T17:18:44.406242" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:44.406475" 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-07T17:18:44.406691" 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-07T17:18:44.406913" 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-07T17:18:44.407156" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:44.407241" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:44.350125" elapsed="0.057251">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:45.437557" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:45.437052" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:45.438104" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:45.437766" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:45.438180" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:18:45.438364" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:45.436622" 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-07T17:18:45.443020" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:45.442810" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:45.443432" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.443195" elapsed="0.000311">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.443669" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.443869" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444054" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444215" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444392" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444553" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444727" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.444894" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.454780" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.454985" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.464669" 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-07T17:18:45.464870" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.464936" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.442278" elapsed="0.022789">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:45.465180" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:45.465223" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:45.441705" elapsed="0.023541"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.465450" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:45.465334" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:45.465314" 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-07T17:18:45.466814" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:45.467494" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:45.467186" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:45.468305" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:45.468044" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:45.468412" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:45.468561" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:45.467699" elapsed="0.000886"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:45.469133" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:45.468740" elapsed="0.000420"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:45.469653" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:45.469312" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:45.470087" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:45.482801" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:45.469836" elapsed="0.016706">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.486949" elapsed="0.000082"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.487357" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.487717" 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-07T17:18:45.488108" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.488484" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.488851" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.489533" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.489904" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.490281" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:45.489247" elapsed="0.001152"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.489083" elapsed="0.001374"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.490753" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.490883" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.466278" elapsed="0.024872">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:45.491401" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:45.491498" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:45.465661" elapsed="0.025889"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:45.492962" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.492222" elapsed="0.000907">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:45.491729" elapsed="0.001540">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:45.491689" elapsed="0.001651">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.493439" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.441162" elapsed="0.052493">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.494133" 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-07T17:18:45.494298" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.494358" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:45.438770" elapsed="0.055687">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.494619" 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-07T17:18:45.494791" 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-07T17:18:45.494954" elapsed="0.000034"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:45.495126" 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-07T17:18:45.495290" 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-07T17:18:45.495448" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:45.495507" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:45.435833" elapsed="0.059771">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:46.527593" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:46.527119" elapsed="0.000506"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:46.528119" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:46.527790" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:46.528192" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:46.528395" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:46.526723" 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-07T17:18:46.532922" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:46.532731" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:46.533357" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.533117" elapsed="0.000317">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.533596" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.533803" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.533957" elapsed="0.000034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.534132" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.534383" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.534544" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.534718" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.534876" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.544773" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.544979" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.554639" 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-07T17:18:46.554825" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.554890" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.532186" elapsed="0.022835">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:46.555134" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:46.555176" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:46.531615" elapsed="0.023584"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.555400" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:46.555286" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:46.555266" 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-07T17:18:46.556763" elapsed="0.000222"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:46.557442" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:46.557136" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:46.558418" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:46.558153" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:46.558491" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:46.558637" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:46.557647" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:46.559197" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:46.558815" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:46.559720" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:46.559375" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:46.560145" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:46.573167" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:46.559902" elapsed="0.016249">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.576690" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.577139" elapsed="0.000051"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.577530" elapsed="0.000049"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.577914" elapsed="0.000076"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.578350" 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-07T17:18:46.578732" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.579397" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.579801" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.580208" elapsed="0.000050"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:46.579093" elapsed="0.001261"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.578891" elapsed="0.001528"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.580748" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.580887" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.556217" elapsed="0.024983">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:46.581449" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:46.581548" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:46.555609" elapsed="0.025991"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:46.583127" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.582311" elapsed="0.000958">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:46.581783" elapsed="0.001624">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:46.581743" elapsed="0.001736">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.583579" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.531076" elapsed="0.052723">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.584214" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.584623" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.584761" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:46.528715" elapsed="0.056364">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:46.585345" 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-07T17:18:46.585520" 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-07T17:18:46.585696" 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-07T17:18:46.585855" 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-07T17:18:46.586038" 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-07T17:18:46.586199" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:46.586259" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:46.525999" elapsed="0.060359">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:47.618544" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:47.618068" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:47.619068" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:47.618740" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:47.619141" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:18:47.619312" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:47.617670" 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-07T17:18:47.624288" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:47.624100" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:47.624691" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.624461" elapsed="0.000304">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.624925" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625140" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625294" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625457" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625635" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625795" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.625977" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.626135" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.635837" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.636121" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.645771" 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-07T17:18:47.645961" elapsed="0.000034"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.646040" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.623530" elapsed="0.022627">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:47.646269" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:47.646311" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:47.622953" elapsed="0.023381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.646539" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:47.646421" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:47.646401" 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-07T17:18:47.647919" elapsed="0.000227"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:47.648607" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:47.648297" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:47.649547" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:47.649176" elapsed="0.000399"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:47.649622" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:47.649770" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:47.648813" elapsed="0.000980"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:47.650349" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:47.649948" elapsed="0.000427"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:47.650870" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:47.650526" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:47.651297" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:47.666195" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:47.651066" elapsed="0.018010">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.669483" 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-07T17:18:47.669854" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.670243" 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-07T17:18:47.670595" 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-07T17:18:47.670960" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.671341" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.672060" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.672440" 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-07T17:18:47.672788" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:47.671728" elapsed="0.001175"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.671570" elapsed="0.001419"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.673302" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.673433" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.647367" elapsed="0.026313">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:47.673937" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:47.674065" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:47.646751" elapsed="0.027368"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:47.675522" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.674778" elapsed="0.000874">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:47.674305" elapsed="0.001484">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:47.674264" elapsed="0.001639">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.676041" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.622412" elapsed="0.053852">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.676642" 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-07T17:18:47.677031" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.677185" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:47.619633" elapsed="0.057674">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:47.677467" 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-07T17:18:47.677639" 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-07T17:18:47.677800" 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-07T17:18:47.677954" 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-07T17:18:47.678129" 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-07T17:18:47.678285" elapsed="0.000054"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:47.678383" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:47.616901" elapsed="0.061580">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:48.706658" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:48.706188" elapsed="0.000503"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:48.707184" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:48.706855" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:48.707258" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:18:48.707450" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:48.705789" 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-07T17:18:48.712025" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:48.711816" elapsed="0.000235"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:48.712437" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.712203" elapsed="0.000307">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.753474" elapsed="0.000060"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.753764" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.753926" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.754116" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.754296" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.754456" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.754628" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.754785" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.764921" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.765133" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.775073" 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-07T17:18:48.775266" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.775431" elapsed="0.000025"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.711268" elapsed="0.064323">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:48.775729" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:48.775774" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:48.710696" elapsed="0.065101"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.776047" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:48.775891" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:48.775870" elapsed="0.000246"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:18:48.777522" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:48.778225" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:48.777888" elapsed="0.000363"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:48.779050" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:48.778765" elapsed="0.000312"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:48.779125" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:18:48.779283" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:48.778431" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:48.779849" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:48.779477" elapsed="0.000398"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:48.780392" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:48.780044" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:48.780804" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:48.793806" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:48.780577" elapsed="0.017198">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.798235" elapsed="0.000061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.798637" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.799029" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.799418" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.799791" 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-07T17:18:48.800172" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.800754" 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-07T17:18:48.801156" 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-07T17:18:48.801507" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:48.800474" elapsed="0.001150"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.800324" elapsed="0.001361"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.802019" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.802154" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.776939" elapsed="0.025560">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:48.802760" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:48.802858" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:48.776270" elapsed="0.026640"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:48.804302" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.803662" elapsed="0.000701">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:48.803134" elapsed="0.001291">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:48.803090" elapsed="0.001367">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.804504" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.710151" elapsed="0.094452">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.804778" 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-07T17:18:48.804940" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.805022" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:48.707775" elapsed="0.097348">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:48.805287" 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-07T17:18:48.805461" 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-07T17:18:48.805626" 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-07T17:18:48.805781" 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-07T17:18:48.805941" 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-07T17:18:48.806121" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:48.806184" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:48.705056" elapsed="0.101230">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:49.836743" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:49.836270" elapsed="0.000505"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.837275" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:49.836943" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:49.837351" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:18:49.837522" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:49.835776" elapsed="0.001771"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:18:49.842091" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:18:49.841888" elapsed="0.000229"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:18:49.842491" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.842266" elapsed="0.000295">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.842916" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.843143" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.843303" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.843466" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.843648" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.843810" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.844018" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.844181" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.853979" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.854173" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.864067" 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-07T17:18:49.864257" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.864323" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.841354" elapsed="0.023082">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:18:49.864547" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:49.864591" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.840780" elapsed="0.023834"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.864859" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:49.864701" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:49.864682" 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-07T17:18:49.866245" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.866931" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:18:49.866601" elapsed="0.000358"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:49.867749" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:49.867489" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:18:49.867822" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:49.867983" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:49.867156" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.868526" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:49.868163" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.869060" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:18:49.868704" elapsed="0.000382"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:18:49.869469" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']"
        }
    }
    </msg>
<msg time="2026-04-07T17:18:49.882423" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:18:49.869246" elapsed="0.015944">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.885595" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.885997" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.886360" 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-07T17:18:49.886719" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.887137" 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-07T17:18:49.887496" 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-07T17:18:49.888103" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.888479" 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-07T17:18:49.888829" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:18:49.887790" elapsed="0.001157"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.887642" elapsed="0.001394"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.889339" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.889471" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.865691" elapsed="0.024020">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:18:49.889995" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:18:49.890100" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.865093" elapsed="0.025061"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.891509" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.891050" elapsed="0.000519">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:49.890442" elapsed="0.001393">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</branch>
<status status="FAIL" start="2026-04-07T17:18:49.890399" elapsed="0.001474">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.891920" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.840238" elapsed="0.051797">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.892212" 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-07T17:18:49.892377" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.892439" 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 ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:18:49.837847" elapsed="0.054691">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:49.892702" 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-07T17:18:49.892875" 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-07T17:18:49.893054" 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-07T17:18:49.893211" 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-07T17:18:49.893372" 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-07T17:18:49.893531" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.893592" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:18:49.835041" elapsed="0.058648">Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<msg time="2026-04-07T17:18:49.893788" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.100732" elapsed="20.793147">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.893954" elapsed="0.000029"/>
</return>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:18:29.098665" elapsed="20.795404">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</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-07T17:18:49.894287" elapsed="0.000023"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:18:28.719369" elapsed="21.175083">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282</status>
</test>
<test id="s1-s1-s2-t26" name="Create Bridge Manually and Verify After Recover" line="133">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:49.898389" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:49.898129" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.899632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:49.899524" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:49.899506" 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-07T17:18:49.904207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:49.904102" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:49.904084" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.905253" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:49.904857" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:49.905733" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:49.905433" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:49.905802" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:49.905953" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:49.904492" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.911161" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:49.911053" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:49.911034" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:49.912451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:49.912345" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:49.912328" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:49.913028" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:49.912654" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:49.913460" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:49.913206" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:49.945135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:49.914029" elapsed="0.031305"/>
</kw>
<msg time="2026-04-07T17:18:49.945504" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:49.945550" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.913636" elapsed="0.031949"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.012354" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:49.946154" elapsed="0.066530"/>
</kw>
<msg time="2026-04-07T17:18:50.012932" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:50.013000" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.945747" elapsed="0.067291"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.013516" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.013163" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.013125" elapsed="0.000594"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.014372" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.013867" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.014772" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.014530" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.014511" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:50.014930" elapsed="0.000056"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.017448" elapsed="0.000538"/>
</kw>
<kw name="Open 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-07T17:18:50.018929" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:50.020383" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:50.015923" elapsed="0.004861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:50.015282" elapsed="0.005617"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:49.912046" elapsed="0.109004"/>
</kw>
<msg time="2026-04-07T17:18:50.021161" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.021206" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.911373" elapsed="0.109869"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:50.021430" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:50.021322" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.021303" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.021926" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.022289" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.022359" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:49.910691" elapsed="0.111778"/>
</kw>
<msg time="2026-04-07T17:18:50.022566" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.022610" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.906349" elapsed="0.116296"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.023011" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.022722" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.022705" elapsed="0.000384"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:49.906214" elapsed="0.116899"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.028649" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:50.028541" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.028522" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.029896" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:50.029789" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.029771" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:50.030479" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:50.030120" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.030952" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:50.030656" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.063890" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:50.031588" elapsed="0.032486"/>
</kw>
<msg time="2026-04-07T17:18:50.064243" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:50.064288" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.031213" elapsed="0.033110"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.127173" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:50.064934" elapsed="0.062430"/>
</kw>
<msg time="2026-04-07T17:18:50.127531" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:50.127576" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.064487" elapsed="0.063123"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.127906" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.127687" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.127668" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.128540" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.128169" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.128897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.128688" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.128671" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:50.129044" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.131362" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:18:50.132798" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:50.134211" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:50.129877" elapsed="0.004730"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:50.129306" elapsed="0.005413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:50.029490" elapsed="0.105356"/>
</kw>
<msg time="2026-04-07T17:18:50.134937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.134995" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.028862" elapsed="0.106171"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:50.135223" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:50.135118" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.135099" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.135686" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.136025" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.136096" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:50.028191" elapsed="0.108050"/>
</kw>
<msg time="2026-04-07T17:18:50.136335" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.136378" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.023401" elapsed="0.113011"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.136728" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.136486" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.136469" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:50.023263" elapsed="0.113564"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.142184" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:50.142078" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.142059" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.143436" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:50.143331" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.143313" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:50.144007" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:50.143639" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.144430" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:50.144186" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.175606" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:50.145040" elapsed="0.030742"/>
</kw>
<msg time="2026-04-07T17:18:50.175955" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:50.176023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.144608" elapsed="0.031451"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.239643" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:50.176626" elapsed="0.063209"/>
</kw>
<msg time="2026-04-07T17:18:50.240023" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:50.240070" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.176232" elapsed="0.063874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.240407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.240184" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.240164" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.241041" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.240644" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.241401" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.241190" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.241172" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:50.241532" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.243850" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:18:50.245320" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:50.246768" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:50.242383" elapsed="0.004790"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:50.241789" elapsed="0.005496"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:50.143034" elapsed="0.104349"/>
</kw>
<msg time="2026-04-07T17:18:50.247474" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.247517" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.142397" elapsed="0.105155"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:50.247734" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:50.247627" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.247608" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.248207" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.248528" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.248599" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:50.141726" elapsed="0.106978"/>
</kw>
<msg time="2026-04-07T17:18:50.248800" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:50.248846" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:50.137113" elapsed="0.111768"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.249214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.248956" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.248938" elapsed="0.000352"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:50.136948" elapsed="0.112366"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:49.906044" elapsed="0.343300"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:49.903732" elapsed="0.345673"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:49.899240" elapsed="0.350227"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:49.898793" elapsed="0.350722"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:49.895708" elapsed="0.353865"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:18:50.257791" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.257529" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.257511" elapsed="0.000359"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.258190" 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-07T17:18:50.258291" 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-07T17:18:50.258046" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.258851" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:18:50.258464" elapsed="0.000433"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.259443" level="INFO">${conn_id} = 327</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-07T17:18:50.259063" elapsed="0.000405"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.260447" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:50.260523" 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-07T17:18:50.260152" elapsed="0.000394"/>
</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-07T17:18:50.260698" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.261875" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:50.859159" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:14 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:50.261561" elapsed="0.597758"/>
</kw>
<msg time="2026-04-07T17:18:50.859406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.261206" elapsed="0.598285"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:50.259744" elapsed="0.599867"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:50.860180" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:18:50.903635" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:50.904068" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:50.904180" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:50.859872" elapsed="0.044367"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:50.904749" elapsed="0.000715"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.906673" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.905918" elapsed="0.000856"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.907318" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:50.906963" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.906907" elapsed="0.000579"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:50.907856" elapsed="0.000072"/>
</return>
<status status="PASS" start="2026-04-07T17:18:50.907611" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.907576" elapsed="0.000522"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.908180" elapsed="0.000033"/>
</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-07T17:18:50.914690" elapsed="0.000798"/>
</kw>
<kw name="Open 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-07T17:18:50.915657" elapsed="0.000225"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:50.916042" 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-07T17:18:50.908954" elapsed="0.007243"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:50.257010" elapsed="0.659281"/>
</kw>
<msg time="2026-04-07T17:18:50.916350" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.256448" elapsed="0.659976"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:50.255758" elapsed="0.660753"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.917068" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:50.916713" elapsed="0.000382"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.917557" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:50.917266" elapsed="0.000316"/>
</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-07T17:18:50.927638" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:50.927244" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.928143" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:50.927823" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:50.928212" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:50.928365" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:50.926859" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.933709" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:50.933411" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:50.933780" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:50.933925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:50.933067" elapsed="0.000882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.940316" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.940065" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.940780" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.940519" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:50.949782" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:50.949949" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:50.950086" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:50.942796" elapsed="0.007316"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.940892" elapsed="0.009263"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.950351" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.950181" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.940873" elapsed="0.009655"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.955102" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.951956" elapsed="0.003212"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.951651" elapsed="0.003564"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.951625" elapsed="0.003626"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.958608" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.955630" elapsed="0.003040"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.955329" elapsed="0.003389"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.955306" elapsed="0.003446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.959543" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:50.958989" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.959870" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.959639" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.960421" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:50.960122" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.959950" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.959622" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.961027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:50.960654" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.961389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.961159" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.961916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:50.961623" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.961469" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.961140" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:50.962158" elapsed="0.000369"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:50.963000" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:50.962688" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:50.963178" elapsed="0.002099"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:50.951060" elapsed="0.014278"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:50.965516" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:50.965411" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.965393" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.965740" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:50.965809" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:50.967921" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:50.934303" elapsed="0.033645"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:50.968014" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:50.968163" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:50.932558" elapsed="0.035630"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.969350" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:50.968954" elapsed="0.000463"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:50.968803" elapsed="0.000653"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:50.968668" elapsed="0.000818"/>
</for>
<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="PASS" start="2026-04-07T17:18:50.968408" elapsed="0.001131"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:50.928604" elapsed="0.040968"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.974889" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:50.974591" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:50.974961" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:50.975124" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:50.974241" elapsed="0.000908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.981230" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.980981" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:50.981662" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:50.981423" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:50.997923" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:50.998048" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:50.998140" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:50.983725" elapsed="0.014473"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:50.981770" elapsed="0.016472"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:50.998565" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:50.998268" elapsed="0.000441"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:50.981752" elapsed="0.017005"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.005917" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.001009" elapsed="0.005039"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.000506" elapsed="0.005619"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.000465" elapsed="0.005715"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.009319" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.006826" elapsed="0.002537"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.006302" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.006265" elapsed="0.003156"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.009939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.009572" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.010280" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.010052" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.010821" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.010525" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.010361" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.010034" elapsed="0.000869"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.011426" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.011069" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.011746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.011521" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.012282" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.011990" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.011825" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.011504" elapsed="0.000859"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.012507" elapsed="0.000336"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:51.013286" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.013016" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.013463" elapsed="0.002247"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:50.999544" elapsed="0.016227"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:51.015944" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.015839" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.015822" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.016199" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.016268" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:51.018385" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:50.975467" elapsed="0.042967"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:51.018487" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:51.018635" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:50.973743" elapsed="0.044917"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.019848" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:51.019480" elapsed="0.000432"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:51.019332" elapsed="0.000619"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:51.019204" elapsed="0.000792"/>
</for>
<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="PASS" start="2026-04-07T17:18:51.018924" elapsed="0.001125"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:50.969658" elapsed="0.050425"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.025260" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.024947" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:51.025331" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.025476" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.024613" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.031762" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.031514" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.032253" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.031953" elapsed="0.000345"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:51.047109" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:51.047296" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:51.047496" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:51.034272" elapsed="0.013280"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.032369" elapsed="0.015276"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.048070" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.047704" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.032351" elapsed="0.015914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.058325" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.050508" elapsed="0.007973"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.050002" elapsed="0.008559"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.049933" elapsed="0.008684"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.061517" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.059257" elapsed="0.002304"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.058740" elapsed="0.002856"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.058703" elapsed="0.002918"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.062160" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.061775" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.062495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.062256" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.063046" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.062730" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.062577" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.062238" elapsed="0.000892"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.063647" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.063283" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.063980" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.063741" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.064507" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.064216" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.064062" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.063724" elapsed="0.000903"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.064772" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:51.065560" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.065290" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.065735" elapsed="0.002099"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:51.049051" elapsed="0.018845"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:51.068085" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.067965" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.067947" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.068310" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.068379" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:51.070503" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:51.025816" elapsed="0.044715"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:51.070581" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.070728" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:51.024134" elapsed="0.046619"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.071884" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:51.071518" elapsed="0.000429"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:51.071373" elapsed="0.000629"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:51.071245" elapsed="0.000787"/>
</for>
<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="PASS" start="2026-04-07T17:18:51.070985" elapsed="0.001099"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:51.020170" elapsed="0.051946"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:50.928451" elapsed="0.143693"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:50.926261" elapsed="0.145930"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:18:50.917844" elapsed="0.154397"/>
</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-07T17:18:51.081752" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:51.081376" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.082247" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:51.081932" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:51.082316" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:51.082495" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.081009" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.087743" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.087448" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:51.087813" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.087957" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.087112" elapsed="0.000920"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.094327" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.094076" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.094787" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.094543" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:51.102184" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:51.104156" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:51.104397" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:51.096789" elapsed="0.007647"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.094897" elapsed="0.009599"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.104766" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.104537" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.094879" elapsed="0.010017"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.109514" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.106322" elapsed="0.003279"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.106018" elapsed="0.003630"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.105991" elapsed="0.003691"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.113122" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.110138" elapsed="0.003046"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.109813" elapsed="0.003418"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.109788" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.114042" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.113483" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.114527" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.114179" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.115300" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.114855" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.114643" elapsed="0.000761"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.114153" elapsed="0.001288"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.115993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.115623" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.116315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.116089" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.116838" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.116547" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.116396" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.116071" elapsed="0.000848"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.117077" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:51.117851" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.117581" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.118038" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:51.105400" elapsed="0.014811"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:51.120389" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.120280" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.120262" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.120615" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.120685" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:51.122895" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:51.088357" elapsed="0.034566"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:51.122987" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.123137" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:51.086622" elapsed="0.036541"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.124317" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:51.123928" elapsed="0.000472"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:51.123782" elapsed="0.000657"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:51.123654" elapsed="0.000814"/>
</for>
<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="PASS" start="2026-04-07T17:18:51.123393" elapsed="0.001126"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:51.082699" elapsed="0.041854"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.129950" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.129599" elapsed="0.000393"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:51.130039" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:51.130186" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.129256" elapsed="0.000954"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.136475" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.136228" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.136905" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.136666" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:51.150812" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:51.153502" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:51.153748" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:51.139101" elapsed="0.014704"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.137030" elapsed="0.016868"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.154318" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.153956" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.137011" elapsed="0.017517"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.161994" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.156805" elapsed="0.005398"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.156299" elapsed="0.005982"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.156256" elapsed="0.006120"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.165443" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.163025" elapsed="0.002463"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.162507" elapsed="0.003015"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.162469" elapsed="0.003078"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.166085" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.165701" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.166420" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.166182" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.166946" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.166652" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.166500" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.166164" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.167554" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.167198" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.167873" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.167649" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.168416" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.168123" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.167953" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.167631" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.168643" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:51.169423" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.169157" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.169596" elapsed="0.002263"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:51.155318" elapsed="0.016603"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:51.172109" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.172004" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.171985" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.172335" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.172404" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:51.174631" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:51.130538" elapsed="0.044121"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:51.174709" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:51.174856" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:51.128757" elapsed="0.046125"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.176040" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:51.175654" elapsed="0.000462"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:51.175508" elapsed="0.000648"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:51.175379" elapsed="0.000806"/>
</for>
<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="PASS" start="2026-04-07T17:18:51.175119" elapsed="0.001117"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:51.124639" elapsed="0.051672"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.181482" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.181186" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:51.181554" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.181697" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.180831" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.187900" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.187653" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.188351" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.188109" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:51.203264" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:51.203445" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:51.203553" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:51.190366" elapsed="0.013213"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.188462" elapsed="0.015159"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.203796" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.203647" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.188443" elapsed="0.015438"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.211523" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.206022" elapsed="0.005709"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.205515" elapsed="0.006297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.205474" elapsed="0.006394"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.216332" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.212517" elapsed="0.003860"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.212027" elapsed="0.004384"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.211956" elapsed="0.004479"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.216957" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.216591" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.217298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.217070" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.217826" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.217531" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.217379" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.217052" elapsed="0.000857"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.218443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.218076" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.218765" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.218539" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.219303" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:51.219011" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:51.218844" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.218521" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.219528" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:51.220309" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:51.220040" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.220482" elapsed="0.002125"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:51.204547" elapsed="0.018122"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:51.222842" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.222737" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.222719" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.223083" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.223153" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:51.225382" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:51.182057" elapsed="0.043354"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:51.225462" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:51.225609" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:51.180349" elapsed="0.045286"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.226803" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:51.226433" elapsed="0.000446"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:51.226257" elapsed="0.000661"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:51.226129" elapsed="0.000819"/>
</for>
<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="PASS" start="2026-04-07T17:18:51.225855" elapsed="0.001161"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:51.176402" elapsed="0.050683"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:51.082570" elapsed="0.144546"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.080439" elapsed="0.146727"/>
</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_operational}</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-07T17:18:51.072424" elapsed="0.154794"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:50.253676" elapsed="0.973605"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:49.895066" elapsed="1.332348"/>
</test>
<test id="s1-s1-s2-t27" name="Add Port Manually and Verify After Recover" line="137">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:51.230637" elapsed="0.000204"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:51.230379" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.231861" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.231753" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.231735" 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-07T17:18:51.236630" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.236524" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.236507" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.237877" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:51.237474" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.238396" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:51.238082" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:51.238466" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.238618" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.236911" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.243757" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.243650" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.243631" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.245058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.244929" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.244912" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:51.245622" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.245262" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.246078" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:51.245799" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.276640" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:51.246667" elapsed="0.030136"/>
</kw>
<msg time="2026-04-07T17:18:51.276993" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:51.277042" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.246258" elapsed="0.030819"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.340505" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:51.277636" elapsed="0.063068"/>
</kw>
<msg time="2026-04-07T17:18:51.340878" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:51.340991" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.277245" elapsed="0.063787"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.341339" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.341111" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.341091" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.341953" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.341582" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.342345" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.342120" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.342101" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:51.342479" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.344792" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:18:51.346265" elapsed="0.000616"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:51.347811" elapsed="0.000424"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.343334" elapsed="0.004972"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:51.342736" elapsed="0.005685"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:51.244632" elapsed="0.103887"/>
</kw>
<msg time="2026-04-07T17:18:51.348610" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.348653" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.243983" elapsed="0.104705"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:51.348870" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.348765" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.348746" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.349355" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.349684" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.349754" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:51.243309" elapsed="0.106552"/>
</kw>
<msg time="2026-04-07T17:18:51.349952" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.350010" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.239009" elapsed="0.111037"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.350569" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.350121" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.350103" elapsed="0.000560"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:51.238858" elapsed="0.111831"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.355759" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.355652" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.355633" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.357005" elapsed="0.000047"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.356885" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.356867" elapsed="0.000241"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:51.357599" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.357249" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.358038" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:51.357778" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.389884" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:51.358611" elapsed="0.031462"/>
</kw>
<msg time="2026-04-07T17:18:51.390253" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:51.390301" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.358217" elapsed="0.032119"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.448842" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:51.390885" elapsed="0.058314"/>
</kw>
<msg time="2026-04-07T17:18:51.449457" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:51.449506" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.390503" elapsed="0.059039"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.450056" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.449674" elapsed="0.000466"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.449633" elapsed="0.000538"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.450824" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.450331" elapsed="0.000581"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.451211" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.450996" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.450961" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:51.451349" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.453882" elapsed="0.000619"/>
</kw>
<kw name="Open 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-07T17:18:51.455484" elapsed="0.000536"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:51.456937" elapsed="0.000348"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.452364" elapsed="0.004993"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:51.451694" elapsed="0.005778"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:51.356590" elapsed="0.100985"/>
</kw>
<msg time="2026-04-07T17:18:51.457673" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.457718" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.355983" elapsed="0.101772"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:51.457942" elapsed="0.000045"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.457834" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.457815" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.458480" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.459180" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.459255" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:51.355320" elapsed="0.104046"/>
</kw>
<msg time="2026-04-07T17:18:51.459464" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.459508" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.350960" elapsed="0.108583"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.459868" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.459620" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.459603" elapsed="0.000343"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:51.350820" elapsed="0.109193"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.465380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.465273" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.465254" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.466642" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.466536" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.466518" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:51.467225" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.466847" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.467653" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:51.467403" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.497494" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:51.468254" elapsed="0.029411"/>
</kw>
<msg time="2026-04-07T17:18:51.497832" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:51.497877" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.467830" elapsed="0.030081"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.554952" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:51.498495" elapsed="0.056655"/>
</kw>
<msg time="2026-04-07T17:18:51.555314" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:51.555358" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.498097" elapsed="0.057296"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.555682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.555468" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.555449" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.556308" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.555922" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.556661" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.556453" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.556435" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:51.556789" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.559146" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:18:51.560572" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:51.561960" elapsed="0.000407"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.557679" elapsed="0.004758"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:51.557105" elapsed="0.005450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:51.466239" elapsed="0.096416"/>
</kw>
<msg time="2026-04-07T17:18:51.562745" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.562788" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.465591" elapsed="0.097232"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:51.563044" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.562898" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.562880" elapsed="0.000248"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.563507" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.563832" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.563901" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:51.464913" elapsed="0.099117"/>
</kw>
<msg time="2026-04-07T17:18:51.564123" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:51.564166" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.460294" elapsed="0.103907"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:51.564518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.564275" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.564258" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:51.460156" elapsed="0.104460"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:51.238693" elapsed="0.325953"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:51.236162" elapsed="0.328549"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:51.231472" elapsed="0.333303"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:51.231055" elapsed="0.333772"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:51.228352" elapsed="0.336535"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:18:51.573081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:51.572805" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.572786" elapsed="0.000377"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.573454" 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-07T17:18:51.573555" 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-07T17:18:51.573309" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.574122" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:18:51.573731" elapsed="0.000499"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.574759" level="INFO">${conn_id} = 332</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-07T17:18:51.574385" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.575709" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:51.575783" 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-07T17:18:51.575417" elapsed="0.000390"/>
</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-07T17:18:51.575959" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.577130" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:51.898411" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:50 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:51.576798" elapsed="0.321786"/>
</kw>
<msg time="2026-04-07T17:18:51.898672" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.576450" elapsed="0.322309"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:51.575019" elapsed="0.323860"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:51.899459" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:18:51.974431" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:51.974690" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:51.974789" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:51.899167" elapsed="0.075677"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:51.975249" elapsed="0.000945"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.977321" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:51.976621" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.977899" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:51.977600" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.977546" elapsed="0.000554"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:51.978453" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:18:51.978221" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:51.978187" elapsed="0.000447"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:51.978706" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.983841" elapsed="0.000491"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.984555" elapsed="0.000223"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:51.984984" elapsed="0.000156"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:51.979441" elapsed="0.005770"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:51.572284" elapsed="0.413052"/>
</kw>
<msg time="2026-04-07T17:18:51.985588" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:51.571718" elapsed="0.413938"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:51.571223" elapsed="0.414623"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.986576" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.986122" elapsed="0.000491"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.987287" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:51.986853" elapsed="0.000469"/>
</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-07T17:18:51.997817" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:51.997438" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:51.998346" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:51.998043" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:51.998422" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:51.998574" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.997071" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.004235" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.003915" elapsed="0.000347"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.004307" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:52.004450" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.003563" elapsed="0.000911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.010820" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.010565" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.011274" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.011032" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.019144" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.019282" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.019376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.013281" elapsed="0.006121"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.011383" elapsed="0.008061"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.019620" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.019470" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.011364" elapsed="0.008341"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.022970" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.020736" elapsed="0.002297"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.020518" elapsed="0.002550"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.020500" elapsed="0.002593"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.026444" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.023368" elapsed="0.003139"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.023149" elapsed="0.003405"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.023132" elapsed="0.003456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.027397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.026807" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.027852" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.027530" elapsed="0.000495"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.028713" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.028296" elapsed="0.000454"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.028067" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.027505" elapsed="0.001364"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.029641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.029105" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.030115" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.029773" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.030854" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.030446" elapsed="0.000444"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.030229" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.029747" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.031199" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.032366" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.031932" elapsed="0.000465"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.032548" elapsed="0.002198"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.020092" elapsed="0.014717"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.034986" elapsed="0.000049"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.034878" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.034860" elapsed="0.000234"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.035239" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.035309" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:52.037445" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.004810" elapsed="0.032662"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.037523" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:52.037670" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:52.003042" elapsed="0.034652"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.038848" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.038472" elapsed="0.000444"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.038324" elapsed="0.000632"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.038196" elapsed="0.000795"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.037916" elapsed="0.001144"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:51.998809" elapsed="0.040285"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.044478" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.044180" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.044550" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:52.044746" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.043826" elapsed="0.000945"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.050931" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.050686" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.051384" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.051144" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.065534" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.065770" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.065985" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.053429" elapsed="0.012657"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.051493" elapsed="0.014688"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.066574" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.066241" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.051474" elapsed="0.015291"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.074295" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.069314" elapsed="0.005085"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.068793" elapsed="0.005681"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.068750" elapsed="0.005781"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.078615" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.075172" elapsed="0.003488"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.074654" elapsed="0.004040"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.074616" elapsed="0.004103"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.079263" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.078873" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.079586" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.079359" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.080136" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.079821" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.079667" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.079341" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.080723" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.080369" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.081060" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.080817" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.081596" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.081306" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.081142" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.080800" elapsed="0.000876"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.081818" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.082600" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.082333" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.082773" elapsed="0.003818"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.067784" elapsed="0.018870"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.086827" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.086723" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.086705" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.087072" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.087143" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:52.089259" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.045113" elapsed="0.044206"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.089373" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:52.089538" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:52.043324" elapsed="0.046240"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.090712" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.090340" elapsed="0.000436"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.090195" elapsed="0.000622"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.090065" elapsed="0.000780"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.089787" elapsed="0.001109"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:52.039182" elapsed="0.051748"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.096113" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.095798" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.096186" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:52.096330" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.095463" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.102440" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.102195" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.102874" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.102633" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.115105" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.115248" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.115376" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.104878" elapsed="0.010533"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.102989" elapsed="0.012482"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.115716" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.115508" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.102970" elapsed="0.012864"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.120560" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.117244" elapsed="0.003381"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.116916" elapsed="0.003757"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.116891" elapsed="0.003817"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.124095" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.121110" elapsed="0.003048"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.120787" elapsed="0.003418"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.120762" elapsed="0.003477"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.124960" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.124452" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.125446" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.125127" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.126209" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.125768" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.125557" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.125101" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.127153" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.126593" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.127609" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.127289" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.128340" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.127934" elapsed="0.000432"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.127721" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.127264" elapsed="0.001159"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.128567" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.129357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.129085" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.129530" elapsed="0.002123"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.116332" elapsed="0.015383"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.131888" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.131784" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.131765" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.132131" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.132202" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:52.134316" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.096668" elapsed="0.037675"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.134394" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:18:52.134539" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:18:52.094974" elapsed="0.039590"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.135733" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.135342" elapsed="0.000454"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.135193" elapsed="0.000643"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.135063" elapsed="0.000801"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.134782" elapsed="0.001132"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:52.091035" elapsed="0.044913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:51.998658" elapsed="0.137321"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.996487" elapsed="0.139556"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:18:51.987567" elapsed="0.148528"/>
</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-07T17:18:52.145789" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:52.145415" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.146289" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:52.145973" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:52.146357" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:52.146506" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:52.145050" elapsed="0.001479"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.151959" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.151536" elapsed="0.000473"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.152066" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:52.152214" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.151201" elapsed="0.001037"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.158542" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.158296" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.158980" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.158734" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.168298" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.169150" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.169266" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.161161" elapsed="0.008130"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.159110" elapsed="0.010224"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.169602" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.169361" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.159091" elapsed="0.010633"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.174350" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.171131" elapsed="0.003362"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.170807" elapsed="0.003736"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.170782" elapsed="0.003796"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.177867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.174959" elapsed="0.002952"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.174655" elapsed="0.003290"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.174631" elapsed="0.003344"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.178515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.178146" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.178841" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.178612" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.179392" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.179093" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.178921" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.178594" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.179996" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.179631" elapsed="0.000407"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.180335" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.180107" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.180857" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.180567" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.180415" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.180089" elapsed="0.000849"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.181102" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.181887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.181617" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.182079" elapsed="0.002119"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.170225" elapsed="0.014035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.184431" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.184328" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.184309" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.184656" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.184725" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:52.186954" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.152556" elapsed="0.034430"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.187052" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:52.187202" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:52.150703" elapsed="0.036524"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.188365" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.187982" elapsed="0.000460"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.187831" elapsed="0.000650"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.187702" elapsed="0.000809"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.187446" elapsed="0.001115"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:52.146760" elapsed="0.041871"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.193996" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.193682" elapsed="0.000355"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.194083" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:52.194231" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.193321" elapsed="0.000934"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.200356" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.200109" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.200786" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.200549" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.216820" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.217947" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.218232" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.202809" elapsed="0.015481"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.200897" elapsed="0.017488"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.218836" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.218444" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.200877" elapsed="0.018188"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.225416" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.221297" elapsed="0.004254"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.220782" elapsed="0.004819"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.220742" elapsed="0.004894"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.229061" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.226041" elapsed="0.003084"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.225714" elapsed="0.003459"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.225691" elapsed="0.003517"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.229943" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.229430" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.230428" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.230106" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.231230" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.230758" elapsed="0.000513"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.230544" elapsed="0.000779"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.230080" elapsed="0.001274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.231954" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.231588" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.232300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.232070" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.232829" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.232540" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.232384" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.232052" elapsed="0.000861"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.233075" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.233848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.233579" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.234042" elapsed="0.002307"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.219817" elapsed="0.016600"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.236590" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.236487" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.236469" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.236816" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.236887" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:52.239159" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.194571" elapsed="0.044616"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.239238" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:52.239386" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:52.192824" elapsed="0.046593"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.240598" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.240227" elapsed="0.000448"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.240080" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.239932" elapsed="0.000814"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.239670" elapsed="0.001128"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:52.188721" elapsed="0.052154"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.246300" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.246000" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:52.246373" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:52.246519" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.245634" elapsed="0.000910"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.252810" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.252565" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.253265" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.253023" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:52.267125" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:52.267561" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:52.267807" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:52.255305" elapsed="0.012559"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.253376" elapsed="0.014583"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.268386" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.268052" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.253357" elapsed="0.015220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.275490" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1']"}]},{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"ee2876d7-1d8b-4fca-87ff-0c46c139be5b","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"18163b38-95b8-4282-9a89-eb21a6cc0e95","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"0496c2b7-7091-41c2-9911-13c347f5ef77","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"d6:76:28:ee:ca:4f","ovsdb:ofport":65534,"ovsdb:ifindex":10},{"tp-id":"vx1","ovsdb:port-uuid":"a479d345-a676-4044-9923-253e3c90c12b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"a92ee8a2-a049-4bb4-bd7f-b57767f54198","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:d6:76:28:ee:ca:4f"}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.270873" elapsed="0.004751"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.270391" elapsed="0.005282"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.270350" elapsed="0.005359"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.279071" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.276114" elapsed="0.003021"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.275787" elapsed="0.003395"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.275763" elapsed="0.003454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.279945" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.279433" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.280424" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.280104" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.281213" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.280748" elapsed="0.000506"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.280536" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.280077" elapsed="0.001256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.281932" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.281566" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.282272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.282046" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.282795" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:52.282504" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:52.282352" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.282027" elapsed="0.000850"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.283038" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:52.283812" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:52.283543" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.283987" elapsed="0.002137"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:52.269396" elapsed="0.016789"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:52.286356" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.286253" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.286235" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.286585" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.286653" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:52.288856" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:52.246861" elapsed="0.042023"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:52.288934" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:52.289102" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:52.245001" elapsed="0.044127"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.290300" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:52.289911" elapsed="0.000467"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:18:52.289764" elapsed="0.000657"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:52.289634" elapsed="0.000817"/>
</for>
<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="PASS" start="2026-04-07T17:18:52.289346" elapsed="0.001156"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:52.240971" elapsed="0.049599"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:52.146626" elapsed="0.143975"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:18:52.144469" elapsed="0.146183"/>
</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_operational}</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-07T17:18:52.136281" elapsed="0.154421"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:51.569187" elapsed="0.721576"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:51.227793" elapsed="1.063089"/>
</test>
<test id="s1-s1-s2-t28" name="Delete the Bridge Manually and Verify After Recover" line="141">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:52.294629" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:52.294367" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.295855" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.295746" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.295728" 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-07T17:18:52.300693" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.300586" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.300568" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.301744" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:52.301370" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.302260" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:52.301925" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:52.302331" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:52.302483" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:52.300984" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.307620" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.307513" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.307494" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.308896" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.308791" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.308774" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:52.309485" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.309130" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.309918" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:52.309666" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.351518" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:52.310514" elapsed="0.041169"/>
</kw>
<msg time="2026-04-07T17:18:52.351856" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:52.351902" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.310119" elapsed="0.041823"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.416366" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:52.352583" elapsed="0.063973"/>
</kw>
<msg time="2026-04-07T17:18:52.416763" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:52.416810" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.352190" elapsed="0.064655"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.417171" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.416924" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.416903" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.417773" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.417409" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.418160" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.417926" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.417908" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:52.418292" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.420585" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.422032" elapsed="0.000606"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:52.423593" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.419156" elapsed="0.004834"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:52.418551" elapsed="0.005570"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:52.308494" elapsed="0.115727"/>
</kw>
<msg time="2026-04-07T17:18:52.424311" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.424354" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.307831" elapsed="0.116557"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:52.424570" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.424464" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.424445" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.425063" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.425391" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.425466" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:52.307181" elapsed="0.118392"/>
</kw>
<msg time="2026-04-07T17:18:52.425662" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.425705" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.302856" elapsed="0.122883"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.426088" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.425812" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.425796" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:52.302721" elapsed="0.123468"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.431384" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.431277" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.431258" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.432674" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.432567" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.432549" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:52.433253" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.432880" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.433677" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:52.433432" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.462747" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:52.434335" elapsed="0.028571"/>
</kw>
<msg time="2026-04-07T17:18:52.463092" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:52.463138" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.433857" elapsed="0.029316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.522738" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:52.463730" elapsed="0.059222"/>
</kw>
<msg time="2026-04-07T17:18:52.523146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:52.523191" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.463339" elapsed="0.059887"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.523528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.523305" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.523284" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.524157" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.523768" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.524514" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.524306" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.524288" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:52.524645" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.526948" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.528385" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:52.529754" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.525485" elapsed="0.004671"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:52.524893" elapsed="0.005376"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:52.432227" elapsed="0.098141"/>
</kw>
<msg time="2026-04-07T17:18:52.530459" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.530502" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.431603" elapsed="0.098934"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:52.530721" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.530614" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.530595" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.531230" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.531787" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.531861" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:52.430899" elapsed="0.101076"/>
</kw>
<msg time="2026-04-07T17:18:52.532084" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.532127" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.426441" elapsed="0.105721"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.532482" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.532237" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.532220" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:52.426307" elapsed="0.106275"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.537811" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.537704" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.537686" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.539078" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:52.538952" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.538934" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:52.539668" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:52.539283" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.540109" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:52.539849" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.579072" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:52.540671" elapsed="0.038759"/>
</kw>
<msg time="2026-04-07T17:18:52.579815" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:52.579919" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.540290" elapsed="0.039748"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.645110" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:52.581381" elapsed="0.063929"/>
</kw>
<msg time="2026-04-07T17:18:52.645480" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:52.645525" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.580421" elapsed="0.065140"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.645869" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.645641" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.645620" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.646513" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:52.646137" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.646879" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.646667" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.646649" elapsed="0.000386"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:52.647069" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.649396" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:18:52.650827" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:52.652251" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:52.647935" elapsed="0.004705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:52.647327" elapsed="0.005426"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:52.538654" elapsed="0.114199"/>
</kw>
<msg time="2026-04-07T17:18:52.652943" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.652991" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.538043" elapsed="0.115001"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:52.653228" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:52.653123" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.653104" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.653699" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.654044" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:52.654117" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:52.537369" elapsed="0.116855"/>
</kw>
<msg time="2026-04-07T17:18:52.654317" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:52.654361" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.532835" elapsed="0.121563"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:52.654717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.654473" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.654455" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:52.532701" elapsed="0.122116"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:52.302557" elapsed="0.352289"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:52.300224" elapsed="0.354677"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:52.295464" elapsed="0.359493"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:52.295049" elapsed="0.359988"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:52.292068" elapsed="0.363026"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:18:52.663508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:52.663246" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:52.663227" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.663875" 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-07T17:18:52.663981" 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-07T17:18:52.663736" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.664623" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:18:52.664213" elapsed="0.000456"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.665216" level="INFO">${conn_id} = 337</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-07T17:18:52.664820" elapsed="0.000422"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:18:52.666134" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:18:52.666210" 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-07T17:18:52.665841" elapsed="0.000392"/>
</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-07T17:18:52.666387" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.667547" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:18:52.985818" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:51 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:18:52.667236" elapsed="0.318676"/>
</kw>
<msg time="2026-04-07T17:18:52.985980" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.666868" elapsed="0.319193"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:18:52.665453" elapsed="0.320699"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:18:52.986539" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:18:53.071880" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:18:53.072288" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:18:53.072385" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:18:52.986337" elapsed="0.086101"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:53.072888" elapsed="0.000842"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.074869" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.074179" elapsed="0.000782"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.075468" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.075175" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.075123" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:18:53.075976" elapsed="0.000091"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.075741" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.075707" elapsed="0.000490"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.076274" elapsed="0.000033"/>
</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-07T17:18:53.082312" elapsed="0.000897"/>
</kw>
<kw name="Open 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-07T17:18:53.083513" elapsed="0.000190"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:53.083851" elapsed="0.000104"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.076986" elapsed="0.007054"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:18:52.662567" elapsed="0.421573"/>
</kw>
<msg time="2026-04-07T17:18:53.084202" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:52.662016" elapsed="0.422251"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:18:52.661505" elapsed="0.422937"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.085030" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.084673" elapsed="0.000385"/>
</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-07T17:18:53.091331" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:53.090811" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.091853" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:53.091538" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:53.091929" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:18:53.092129" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:53.090415" elapsed="0.001739"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.097902" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.097534" elapsed="0.000401"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:53.098012" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:18:53.098179" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.097157" elapsed="0.001047"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.105136" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.104746" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.105609" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.105357" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:53.115292" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:53.115557" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:53.115735" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:53.107824" elapsed="0.007941"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.105740" elapsed="0.010092"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.116197" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.115876" elapsed="0.000397"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.105714" elapsed="0.010582"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.121658" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.117975" elapsed="0.004124"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.117625" elapsed="0.004536"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.117595" elapsed="0.004607"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.125780" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.122637" elapsed="0.003194"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.122292" elapsed="0.003577"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.122265" elapsed="0.003632"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.126555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.126119" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.126895" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.126657" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.127460" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.127158" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.126982" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.126637" elapsed="0.000907"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.128079" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.127698" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.128421" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.128176" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.128957" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.128660" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.128507" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.128158" elapsed="0.000900"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.129215" elapsed="0.000379"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:53.130072" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.129754" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.130251" elapsed="0.002253"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:53.116868" elapsed="0.015759"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:53.132825" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.132708" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.132687" elapsed="0.000240"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.133099" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.133171" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:53.135498" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:53.098560" elapsed="0.036969"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:53.135584" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:53.135740" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:53.096458" elapsed="0.039308"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.137188" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:53.136720" elapsed="0.000545"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:53.136511" elapsed="0.000794"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:53.136368" elapsed="0.000969"/>
</for>
<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="PASS" start="2026-04-07T17:18:53.136071" elapsed="0.001317"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:53.092360" elapsed="0.045156"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.145358" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.144948" elapsed="0.000445"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:53.145460" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:53.145628" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.144566" elapsed="0.001087"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.152247" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.151861" elapsed="0.000447"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.152716" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.152469" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:53.167035" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:53.167281" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:53.167465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:53.154835" elapsed="0.012674"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.152848" elapsed="0.014747"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.167959" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.167648" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.152821" elapsed="0.015296"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.173559" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.169817" elapsed="0.003849"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.169448" elapsed="0.004285"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.169418" elapsed="0.004364"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.177756" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.174347" elapsed="0.003495"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.173889" elapsed="0.004018"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.173856" elapsed="0.004095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.178873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.178363" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.179252" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.178989" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.179899" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.179588" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.179417" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.178961" elapsed="0.001028"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.180527" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.180159" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.180854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.180624" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.181407" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.181111" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.180936" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.180605" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.181650" elapsed="0.000370"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:53.182516" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.182182" elapsed="0.000365"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.182698" elapsed="0.002474"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:53.168713" elapsed="0.016535"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:53.185442" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.185327" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.185305" elapsed="0.000238"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.185702" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.185775" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:18:53.188108" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:53.146029" elapsed="0.042109"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:53.188194" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:53.188350" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:53.143832" elapsed="0.044544"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.189747" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:53.189308" elapsed="0.000515"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:53.189125" elapsed="0.000738"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:53.188966" elapsed="0.000928"/>
</for>
<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="PASS" start="2026-04-07T17:18:53.188664" elapsed="0.001282"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:53.137621" elapsed="0.052365"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.195422" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.195079" elapsed="0.000372"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:53.195507" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:18:53.195666" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.194646" elapsed="0.001045"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.202040" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.201700" elapsed="0.000396"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.202498" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.202254" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:53.215251" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:53.215571" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:18:53.215780" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:18:53.204722" elapsed="0.011103"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.202726" elapsed="0.013182"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.216289" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.215960" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.202699" elapsed="0.013725"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.222210" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":47596,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.218129" elapsed="0.004182"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.217731" elapsed="0.004643"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.217701" elapsed="0.004720"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.226169" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.222896" elapsed="0.003339"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.222524" elapsed="0.003763"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.222490" elapsed="0.003834"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.227197" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.226595" elapsed="0.000641"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.227734" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.227339" elapsed="0.000486"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.228567" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.228162" elapsed="0.000431"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.227899" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.227312" elapsed="0.001338"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.229185" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.228804" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.229510" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.229281" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.230156" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.229840" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:18:53.229680" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.229263" elapsed="0.000976"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.230391" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:18:53.231222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:18:53.230904" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.231399" elapsed="0.002340"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:18:53.217036" elapsed="0.016776"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:18:53.234013" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.233884" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.233865" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.234257" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.234328" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:18:53.236560" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:18:53.196058" elapsed="0.040530"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:18:53.236641" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:53.236790" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f3d943fd-5b5d-45c3-80db-5eaef391c282","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:18:53.194095" elapsed="0.042722"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.238080" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:18:53.237678" elapsed="0.000474"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:18:53.237523" elapsed="0.000669"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:18:53.237378" elapsed="0.000845"/>
</for>
<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="PASS" start="2026-04-07T17:18:53.237087" elapsed="0.001189"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:53.190092" elapsed="0.048218"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:53.092214" elapsed="0.146126"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:18:53.089748" elapsed="0.148641"/>
</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-07T17:18:53.085241" elapsed="0.153203"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:18:52.659452" elapsed="0.579059"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:18:52.291372" elapsed="0.947266"/>
</test>
<test id="s1-s1-s2-t29" name="Verify Modified Port After Recover" line="145">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:53.242640" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:53.242381" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.243909" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.243796" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.243777" 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-07T17:18:53.248782" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.248675" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.248657" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.249904" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:53.249469" elapsed="0.000462"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.250411" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:53.250105" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:53.250482" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:53.250635" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:53.249098" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.255725" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.255616" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.255597" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.257059" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.256926" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.256908" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:53.257633" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.257271" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.258092" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:53.257813" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.287268" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:53.258661" elapsed="0.028833"/>
</kw>
<msg time="2026-04-07T17:18:53.287711" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:53.287758" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.258279" elapsed="0.029514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.335695" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:53.288465" elapsed="0.047619"/>
</kw>
<msg time="2026-04-07T17:18:53.336342" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:53.336390" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.288023" elapsed="0.048404"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.336912" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.336552" elapsed="0.000458"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.336513" elapsed="0.000528"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.337665" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.337193" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.338041" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.337813" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.337795" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:53.338179" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.340679" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:18:53.342185" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:53.343711" elapsed="0.000611"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.339136" elapsed="0.005261"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:53.338499" elapsed="0.006015"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:53.256610" elapsed="0.088008"/>
</kw>
<msg time="2026-04-07T17:18:53.344715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.344760" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.255939" elapsed="0.088857"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:53.344992" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.344877" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.344857" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.345510" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.345847" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.345919" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:53.255282" elapsed="0.090776"/>
</kw>
<msg time="2026-04-07T17:18:53.346153" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.346196" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.251029" elapsed="0.095201"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.346553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.346305" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.346288" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:53.250876" elapsed="0.095778"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.351780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.351672" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.351653" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.353089" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.352963" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.352946" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:53.353663" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.353295" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.354424" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:53.353842" elapsed="0.000608"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.387797" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:53.354990" elapsed="0.033064"/>
</kw>
<msg time="2026-04-07T17:18:53.388295" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:53.388343" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.354607" elapsed="0.033771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.439336" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:53.389177" elapsed="0.050378"/>
</kw>
<msg time="2026-04-07T17:18:53.439747" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:53.439792" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.388641" elapsed="0.051274"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.440341" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.440052" elapsed="0.000368"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.440016" elapsed="0.000435"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.441022" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.440596" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.441385" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.441173" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.441154" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:53.441524" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.444007" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:18:53.445463" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:53.446869" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.442481" elapsed="0.004808"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:53.441844" elapsed="0.005560"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:53.352664" elapsed="0.094861"/>
</kw>
<msg time="2026-04-07T17:18:53.447624" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.447669" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.352009" elapsed="0.095696"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:53.447898" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.447789" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.447765" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.448412" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.449044" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.449118" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:53.351324" elapsed="0.097905"/>
</kw>
<msg time="2026-04-07T17:18:53.449323" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.449366" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.346919" elapsed="0.102482"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.449722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.449477" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.449460" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:53.346783" elapsed="0.103039"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.455194" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.455085" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.455066" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.456467" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.456359" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.456342" elapsed="0.000279"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:53.457186" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.456765" elapsed="0.000449"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.457618" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:53.457369" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.488392" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:53.458266" elapsed="0.030311"/>
</kw>
<msg time="2026-04-07T17:18:53.488761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:53.488807" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.457799" elapsed="0.031043"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:53.537901" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:53.489466" elapsed="0.048932"/>
</kw>
<msg time="2026-04-07T17:18:53.538808" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:53.538909" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.489056" elapsed="0.049995"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.539768" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.539252" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.539198" elapsed="0.000831"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.541206" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.540345" elapsed="0.001036"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.542021" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.541528" elapsed="0.000658"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.541489" elapsed="0.000752"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:53.542318" elapsed="0.000069"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:53.545436" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:18:53.546913" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:53.548366" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.543868" elapsed="0.004901"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:53.542966" elapsed="0.005918"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:53.456055" elapsed="0.092937"/>
</kw>
<msg time="2026-04-07T17:18:53.549104" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.549150" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.455410" elapsed="0.093777"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:53.549378" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:18:53.549267" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.549247" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.549878" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.550302" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.550375" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:53.454718" elapsed="0.095771"/>
</kw>
<msg time="2026-04-07T17:18:53.550586" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:53.550631" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.450113" elapsed="0.100554"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.551026" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.550745" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:53.550728" elapsed="0.000408"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:53.449957" elapsed="0.101202"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:53.250710" elapsed="0.300488"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:53.248297" elapsed="0.302966"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:53.243508" elapsed="0.307816"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:53.243068" elapsed="0.308304"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:53.239938" elapsed="0.311491"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.558254" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:18:53.557863" elapsed="0.000419"/>
</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-07T17:18:53.568229" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:53.567818" elapsed="0.000438"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.568720" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:53.568413" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:53.568791" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:53.568948" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:53.567414" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.574282" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:53.573970" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:53.574354" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:18:53.574498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:53.573628" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.580674" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.580422" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:53.581125" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:53.580866" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:53.590954" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:53.591151" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:53.591322" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:53.583278" elapsed="0.008465">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:53.581236" elapsed="0.010594">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.592040" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:53.591864" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:53.581217" elapsed="0.010915">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.592548" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.592686" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:53.592649" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:53.592632" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:53.592889" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.592963" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:53.574850" elapsed="0.018236">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:53.593147" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:18:53.573142" elapsed="0.020098">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:53.593470" elapsed="0.000028"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:53.569196" elapsed="0.024383">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:53.569047" elapsed="0.024617">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:53.566732" elapsed="0.027067">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:54.610731" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:54.610064" elapsed="0.000712"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:54.611507" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:54.611047" elapsed="0.000498"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:54.611614" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:18:54.611891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:54.609470" elapsed="0.002459"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:54.617416" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:54.617117" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:54.617570" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:18:54.617721" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:54.616762" elapsed="0.000983"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:54.624147" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:54.623868" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:54.624599" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:54.624356" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:54.633614" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:54.633759" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:54.633864" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:54.626614" elapsed="0.007699">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:54.624716" elapsed="0.009683">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:54.634585" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:54.634433" elapsed="0.000219"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:54.624695" elapsed="0.009980">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:54.635075" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:54.635211" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:54.635174" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:54.635157" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:54.635414" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:54.635484" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:54.618105" elapsed="0.017483">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:54.635649" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:18:54.616280" elapsed="0.019462">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:54.635977" elapsed="0.000038"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:54.612243" elapsed="0.023827">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:54.612033" elapsed="0.024096">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:54.608297" elapsed="0.027965">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:55.653208" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:55.652724" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:55.653852" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:55.653407" elapsed="0.000472"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:55.653927" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:18:55.654121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:55.652330" elapsed="0.001817"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:55.659422" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:55.659124" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:55.659493" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:18:55.659638" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:55.658768" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:55.666087" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:55.665813" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:55.666522" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:55.666282" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:55.675428" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:55.675609" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:55.675750" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:55.668544" elapsed="0.007733">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:55.666637" elapsed="0.009755">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:55.676672" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:55.676456" elapsed="0.000313"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:55.666616" elapsed="0.010186">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:55.677328" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:55.677516" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:55.677464" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:55.677441" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:55.677871" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:55.677976" elapsed="0.000039"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:55.660022" elapsed="0.018122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:55.678230" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:18:55.658285" elapsed="0.020075">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:55.678682" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:55.654347" elapsed="0.024444">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:55.654203" elapsed="0.024670">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:55.651503" elapsed="0.027523">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:56.693873" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:56.693477" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:56.694383" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:56.694074" elapsed="0.000335"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:56.694454" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:56.694609" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:56.693106" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:56.699880" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:56.699585" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:56.699952" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:18:56.700116" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:56.699245" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:56.706417" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:56.706169" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:56.706852" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:56.706611" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:56.715799" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:56.715954" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:56.716161" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:56.708868" elapsed="0.007744">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:56.706961" elapsed="0.009783">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:56.717025" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:56.716791" elapsed="0.000326"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:56.706943" elapsed="0.010206">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:56.717654" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:56.717842" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:56.717792" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:56.717769" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:56.718144" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:56.718242" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:56.700469" elapsed="0.017914">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:56.718467" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-04-07T17:18:56.698748" elapsed="0.019846">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:56.718910" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:56.694819" elapsed="0.024220">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:56.694686" elapsed="0.024435">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:56.692425" elapsed="0.026821">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:57.735262" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:57.734743" elapsed="0.000556"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:57.735794" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:57.735476" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:57.735873" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:18:57.736078" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:57.734348" elapsed="0.001755"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:57.741429" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:57.741131" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:57.741606" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:18:57.741763" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:57.740772" elapsed="0.001016"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:57.748195" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:57.747917" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:57.748635" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:57.748391" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:57.758480" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:57.758642" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:57.758757" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:57.750692" elapsed="0.008663">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:57.748756" elapsed="0.010724">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:57.759755" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:57.759531" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:57.748734" elapsed="0.011150">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:57.760444" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:57.760636" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:57.760584" elapsed="0.000113"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:57.760560" elapsed="0.000169"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:57.760933" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:57.761055" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:57.742153" elapsed="0.019055">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:57.761296" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:18:57.740288" elapsed="0.021144">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:57.761765" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:57.736327" elapsed="0.025550">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:57.736169" elapsed="0.025845">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:57.733485" elapsed="0.028733">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:18:58.778620" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:58.778137" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.779158" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:58.778824" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:58.779234" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:18:58.779411" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:58.777725" elapsed="0.001711"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.784740" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:18:58.784440" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:18:58.784812" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:58.784960" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:18:58.784099" elapsed="0.000908"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.793341" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:58.793080" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.793779" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:58.793537" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:18:58.802913" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:18:58.803088" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:18:58.803205" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:18:58.795808" elapsed="0.007797">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:18:58.793899" elapsed="0.009791">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.803885" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:58.803727" elapsed="0.000223"/>
</branch>
<status status="FAIL" start="2026-04-07T17:18:58.793876" elapsed="0.010102">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.804401" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.804535" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.804499" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:18:58.804481" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.804803" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.804893" elapsed="0.000023"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:18:58.785356" elapsed="0.019738">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.805187" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:18:58.783591" elapsed="0.021733">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:18:58.805664" elapsed="0.000035"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:18:58.779644" elapsed="0.026132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:18:58.779494" elapsed="0.026367">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:18:58.776874" elapsed="0.029147">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:18:58.806163" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:18:53.558468" elapsed="5.247831">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:53.555852" elapsed="5.250607">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:53.239333" elapsed="5.567337">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s2-t30" name="Delete Port In New Owner After Recover" line="149">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:58.812361" elapsed="0.000361"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:58.811959" elapsed="0.000845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.813827" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.813713" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.813694" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.818430" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.818323" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.818305" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.819481" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:58.819101" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.819958" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:58.819661" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:58.820045" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:18:58.820248" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:58.818715" elapsed="0.001559"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.825547" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.825439" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.825420" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.826826" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.826721" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.826704" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:58.827424" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:58.827061" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:58.827858" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:58.827606" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:58.861629" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:58.828435" elapsed="0.033360"/>
</kw>
<msg time="2026-04-07T17:18:58.862003" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:58.862052" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.828056" elapsed="0.034031"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:58.914672" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:58.862668" elapsed="0.052212"/>
</kw>
<msg time="2026-04-07T17:18:58.915098" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:58.915144" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.862265" elapsed="0.052914"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.915510" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:58.915267" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.915243" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:58.916159" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:58.915751" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.916518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:58.916308" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.916290" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:58.916651" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:58.919090" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:18:58.920548" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:58.921961" elapsed="0.000390"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:58.917561" elapsed="0.004871"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:58.916947" elapsed="0.005601"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:58.826423" elapsed="0.096228"/>
</kw>
<msg time="2026-04-07T17:18:58.922804" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:58.922850" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.825760" elapsed="0.097126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:58.923111" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:58.922972" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.922948" elapsed="0.000246"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.923601" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.923940" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.924122" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:58.825101" elapsed="0.099135"/>
</kw>
<msg time="2026-04-07T17:18:58.924332" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:58.924377" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.820655" elapsed="0.103758"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:58.924737" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:58.924488" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.924471" elapsed="0.000347"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:58.820495" elapsed="0.104347"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.930355" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.930228" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.930209" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:58.931631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:58.931525" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:58.931507" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:58.932237" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:58.931835" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:58.932663" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:58.932417" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:58.964702" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:58.933243" elapsed="0.031639"/>
</kw>
<msg time="2026-04-07T17:18:58.965078" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:58.965123" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.932843" elapsed="0.032315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.024911" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:58.965736" elapsed="0.059403"/>
</kw>
<msg time="2026-04-07T17:18:59.025317" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.025363" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.965335" elapsed="0.060062"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.025732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.025485" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.025461" elapsed="0.000431"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.026449" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.026060" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.026806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.026597" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.026579" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.026940" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.029359" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:18:59.030834" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.032318" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.027868" elapsed="0.004853"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.027254" elapsed="0.005581"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:58.931225" elapsed="0.101712"/>
</kw>
<msg time="2026-04-07T17:18:59.033050" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.033095" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.930568" elapsed="0.102562"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.033319" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.033210" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.033191" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.033803" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.034172" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.034245" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:58.929694" elapsed="0.104660"/>
</kw>
<msg time="2026-04-07T17:18:59.034450" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.034493" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.925136" elapsed="0.109393"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.034848" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.034605" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.034588" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:58.924995" elapsed="0.109958"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.040456" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.040347" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.040328" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.041700" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.041594" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.041577" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.042389" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.041906" elapsed="0.000509"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.042817" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.042569" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.073182" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.043468" elapsed="0.029880"/>
</kw>
<msg time="2026-04-07T17:18:59.073525" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.073573" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.043084" elapsed="0.030524"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.121791" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.074259" elapsed="0.047753"/>
</kw>
<msg time="2026-04-07T17:18:59.122191" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.122236" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.073781" elapsed="0.048490"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.122601" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.122358" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.122333" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.123479" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.122847" elapsed="0.000714"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.123846" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.123630" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.123612" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.124002" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.126368" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:18:59.127811" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.129333" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.124877" elapsed="0.004861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.124286" elapsed="0.005567"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.041298" elapsed="0.088656"/>
</kw>
<msg time="2026-04-07T17:18:59.130069" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.130114" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.040670" elapsed="0.089479"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.130336" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.130228" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.130209" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.130812" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.131165" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.131238" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.039826" elapsed="0.091521"/>
</kw>
<msg time="2026-04-07T17:18:59.131494" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.131537" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.035242" elapsed="0.096331"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.131894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.131648" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.131631" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:59.035105" elapsed="0.096925"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:58.820326" elapsed="0.311738"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:58.817953" elapsed="0.314172"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:58.813427" elapsed="0.318758"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:58.812991" elapsed="0.319241"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:58.808463" elapsed="0.323826"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:59.143955" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.140453" elapsed="0.003555">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:58.807412" elapsed="0.336793">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t31" name="Delete Bridge In New Owner And Verify After Recover" line="153">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:18:59.148159" elapsed="0.000220"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:59.147881" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.149431" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.149315" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.149295" 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-07T17:18:59.154080" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.153957" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.153939" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.155182" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:59.154740" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.155666" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:59.155363" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:59.155736" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:59.155891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:59.154370" elapsed="0.001547"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.161155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.161048" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.161029" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.162452" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.162347" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.162329" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.163040" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.162658" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.163477" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.163223" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.188679" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.164051" elapsed="0.024816"/>
</kw>
<msg time="2026-04-07T17:18:59.189163" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.189210" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.163656" elapsed="0.025590"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.273191" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.189823" elapsed="0.083641"/>
</kw>
<msg time="2026-04-07T17:18:59.273675" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.273721" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.189422" elapsed="0.084336"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.274194" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.273869" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.273834" elapsed="0.000469"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.274885" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.274448" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.275282" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.275069" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.275050" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.275417" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.277875" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:18:59.279341" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.280786" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.276388" elapsed="0.004811"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.275754" elapsed="0.005559"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.162048" elapsed="0.119365"/>
</kw>
<msg time="2026-04-07T17:18:59.281508" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.281553" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.161367" elapsed="0.120222"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.281772" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.281666" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.281647" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.282284" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.282626" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.282697" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.160696" elapsed="0.122109"/>
</kw>
<msg time="2026-04-07T17:18:59.282899" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.283023" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.156314" elapsed="0.126747"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.283384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.283139" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.283121" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:59.156174" elapsed="0.127311"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.289079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.288955" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.288936" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.290366" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.290259" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.290242" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.290926" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.290569" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.291375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.291123" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.323234" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.291959" elapsed="0.031466"/>
</kw>
<msg time="2026-04-07T17:18:59.323598" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.323645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.291554" elapsed="0.032125"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.402693" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.324288" elapsed="0.078606"/>
</kw>
<msg time="2026-04-07T17:18:59.403080" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.403125" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.323856" elapsed="0.079305"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.403466" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.403242" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.403220" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.404097" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.403704" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.404467" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.404256" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.404237" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.404599" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.406949" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:18:59.408384" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.409809" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.405480" elapsed="0.004800"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.404871" elapsed="0.005524"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.289914" elapsed="0.120581"/>
</kw>
<msg time="2026-04-07T17:18:59.410587" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.410630" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.289293" elapsed="0.121374"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.410852" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.410745" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.410726" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.411338" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.411664" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.411734" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.288607" elapsed="0.123240"/>
</kw>
<msg time="2026-04-07T17:18:59.411940" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.412003" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.283789" elapsed="0.128253"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.412365" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.412119" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.412101" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:59.283622" elapsed="0.128844"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.418060" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.417933" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.417914" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.419320" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.419213" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.419195" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.419889" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.419525" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.420347" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.420093" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.450409" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.420910" elapsed="0.029759"/>
</kw>
<msg time="2026-04-07T17:18:59.450932" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.451032" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.420529" elapsed="0.030564"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.521104" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.452019" elapsed="0.069297"/>
</kw>
<msg time="2026-04-07T17:18:59.521490" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.521536" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.451373" elapsed="0.070269"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.522017" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.521738" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.521711" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.522659" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.522271" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.523054" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.522821" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.522802" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.523193" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.525695" elapsed="0.000543"/>
</kw>
<kw name="Open 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-07T17:18:59.527190" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.528646" elapsed="0.000342"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.524210" elapsed="0.004854"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.523549" elapsed="0.005632"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.418889" elapsed="0.110396"/>
</kw>
<msg time="2026-04-07T17:18:59.529381" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.529425" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.418277" elapsed="0.111186"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.529651" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.529543" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.529523" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.530174" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.530514" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.530586" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.417559" elapsed="0.113136"/>
</kw>
<msg time="2026-04-07T17:18:59.530790" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.530835" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.412724" elapsed="0.118146"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.531310" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.530952" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.530935" elapsed="0.000451"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:59.412591" elapsed="0.118820"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:59.155995" elapsed="0.375451"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:59.153572" elapsed="0.377950"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:59.149024" elapsed="0.382559"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.148579" elapsed="0.383053"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:59.145472" elapsed="0.386256"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:59.543377" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.539852" elapsed="0.003565">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.144712" elapsed="0.398862">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s1-s2-t32" name="Create Bridge In Old Candidate and Verify After Recover" 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-07T17:18:59.547416" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:59.547156" 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-07T17:18:59.548705" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.548593" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.548575" 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-07T17:18:59.553304" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.553198" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.553180" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.554364" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:59.553966" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.554849" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:59.554547" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:59.554917" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:59.555093" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:59.553591" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.560404" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.560297" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.560278" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.561653" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.561546" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.561528" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.562252" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.561859" elapsed="0.000419"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.562682" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.562433" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.594895" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.563260" elapsed="0.031884"/>
</kw>
<msg time="2026-04-07T17:18:59.595312" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.595357" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.562860" elapsed="0.032532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.658263" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.595942" elapsed="0.062529"/>
</kw>
<msg time="2026-04-07T17:18:59.658637" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.658682" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.595560" elapsed="0.063158"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.659092" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.658837" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.658816" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.659704" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.659335" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.660095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.659862" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.659844" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.660228" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.662551" elapsed="0.000542"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.664031" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.665424" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.661078" elapsed="0.004755"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.660488" elapsed="0.005460"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.561246" elapsed="0.104821"/>
</kw>
<msg time="2026-04-07T17:18:59.666157" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.666200" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.560616" elapsed="0.105620"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.666417" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.666311" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.666292" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.666883" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.667245" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.667317" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.559944" elapsed="0.107479"/>
</kw>
<msg time="2026-04-07T17:18:59.667514" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.667557" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.555487" elapsed="0.112106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.667909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.667665" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.667648" elapsed="0.000451"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:59.555350" elapsed="0.112774"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.673551" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.673445" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.673426" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.674813" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.674707" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.674689" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.675399" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.675045" elapsed="0.000422"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.675878" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.675627" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.707367" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.676460" elapsed="0.031089"/>
</kw>
<msg time="2026-04-07T17:18:59.707714" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.707760" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.676079" elapsed="0.031717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.774487" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.708426" elapsed="0.066260"/>
</kw>
<msg time="2026-04-07T17:18:59.774855" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.774900" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.707965" elapsed="0.066972"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.775294" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.775047" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.775024" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.775912" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.775541" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.776300" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.776088" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.776070" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.776430" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.778708" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:18:59.780191" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.781577" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.777265" elapsed="0.004703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.776679" elapsed="0.005418"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.674407" elapsed="0.107790"/>
</kw>
<msg time="2026-04-07T17:18:59.782288" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.782331" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.673778" elapsed="0.108590"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.782549" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.782443" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.782425" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.783039" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.783390" elapsed="0.000073"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.783514" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.673104" elapsed="0.110521"/>
</kw>
<msg time="2026-04-07T17:18:59.783717" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.783763" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.668382" elapsed="0.115417"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.784233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.783874" elapsed="0.000413"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.783857" elapsed="0.000454"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:18:59.668247" elapsed="0.116088"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.789642" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.789535" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.789516" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.790890" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.790783" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.790766" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.791497" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.791124" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.791930" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.791684" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.822724" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.792509" elapsed="0.030396"/>
</kw>
<msg time="2026-04-07T17:18:59.823123" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.823169" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.792130" elapsed="0.031075"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.889149" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.823760" elapsed="0.065593"/>
</kw>
<msg time="2026-04-07T17:18:59.889525" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:18:59.889571" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.823375" elapsed="0.066233"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.889914" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.889689" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.889668" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.890557" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:18:59.890188" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.890925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.890715" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.890697" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:18:59.891078" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:18:59.893406" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.894836" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:18:59.896242" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:18:59.891937" elapsed="0.004694"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:18:59.891330" elapsed="0.005414"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.790484" elapsed="0.106360"/>
</kw>
<msg time="2026-04-07T17:18:59.896960" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.897020" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.789854" elapsed="0.107206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:18:59.897248" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:18:59.897141" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.897121" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.897714" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.898060" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.898131" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.789196" elapsed="0.109042"/>
</kw>
<msg time="2026-04-07T17:18:59.898331" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:18:59.898374" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.784588" elapsed="0.113822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:18:59.898728" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:18:59.898485" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.898468" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:18:59.784454" elapsed="0.114374"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:59.555176" elapsed="0.343680"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:59.552819" elapsed="0.346090"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:59.548303" elapsed="0.350664"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.547863" elapsed="0.351165"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:59.544813" elapsed="0.354269"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:18:59.912384" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.908357" elapsed="0.004066">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.544218" elapsed="0.368351">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t33" name="Create Port In Old Owner and Verify After Recover" 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-07T17:18:59.916408" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:18:59.916153" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.917657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.917541" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.917522" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.922449" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.922343" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.922325" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.923542" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:18:59.923162" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:18:59.924046" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:18:59.923722" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:18:59.924115" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:18:59.924270" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:18:59.922773" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.929491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.929346" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.929327" elapsed="0.000232"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:18:59.930752" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:18:59.930647" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:18:59.930630" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:18:59.931336" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:18:59.930958" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.931755" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:18:59.931513" elapsed="0.000267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:18:59.960705" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:18:59.932337" elapsed="0.028550"/>
</kw>
<msg time="2026-04-07T17:18:59.961085" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:18:59.961131" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.931938" elapsed="0.029228"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.022843" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:18:59.961721" elapsed="0.061343"/>
</kw>
<msg time="2026-04-07T17:19:00.023247" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.023292" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.961335" elapsed="0.061992"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.023634" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.023408" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.023387" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.024279" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.023873" elapsed="0.000491"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.024640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.024431" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.024413" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.024771" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.027087" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.028568" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.029945" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.025620" elapsed="0.004731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.025048" elapsed="0.005413"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:18:59.930350" elapsed="0.100211"/>
</kw>
<msg time="2026-04-07T17:19:00.030653" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.030696" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.929706" elapsed="0.101040"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.030929" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.030824" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.030804" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.031423" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.031751" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.031822" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:18:59.929012" elapsed="0.102917"/>
</kw>
<msg time="2026-04-07T17:19:00.032062" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.032106" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.924646" elapsed="0.107495"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.032460" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.032217" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.032200" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:18:59.924511" elapsed="0.108048"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.037973" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.037857" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.037838" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.039237" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.039131" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.039112" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.039797" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.039440" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.040343" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.040093" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.072024" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.040902" elapsed="0.031282"/>
</kw>
<msg time="2026-04-07T17:19:00.072366" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.072414" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.040523" elapsed="0.031962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.143509" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.073067" elapsed="0.070672"/>
</kw>
<msg time="2026-04-07T17:19:00.143913" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.143961" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.072653" elapsed="0.071370"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.144351" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.144105" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.144084" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.144997" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.144594" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.145369" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.145155" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.145136" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.145503" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.147778" elapsed="0.000555"/>
</kw>
<kw name="Open 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-07T17:19:00.149262" elapsed="0.000460"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.150620" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.146352" elapsed="0.004671"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.145754" elapsed="0.005383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.038803" elapsed="0.112434"/>
</kw>
<msg time="2026-04-07T17:19:00.151330" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.151374" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.038203" elapsed="0.113206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.151593" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.151486" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.151467" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.152081" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.152427" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.152498" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.037519" elapsed="0.115085"/>
</kw>
<msg time="2026-04-07T17:19:00.152695" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.152738" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.032815" elapsed="0.119958"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.153209" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.152848" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.152831" elapsed="0.000457"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:00.032681" elapsed="0.120630"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.158576" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.158470" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.158451" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.159860" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.159755" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.159737" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.160433" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.160083" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.160876" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.160626" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.192590" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.161538" elapsed="0.031258"/>
</kw>
<msg time="2026-04-07T17:19:00.192997" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.193045" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.161158" elapsed="0.031921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.259029" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.193646" elapsed="0.065998"/>
</kw>
<msg time="2026-04-07T17:19:00.260108" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.260180" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.193249" elapsed="0.066983"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.261130" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.260470" elapsed="0.000787"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.260385" elapsed="0.000920"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.262399" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.261522" elapsed="0.001015"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.262954" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.262633" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.262606" elapsed="0.000499"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.263153" elapsed="0.000063"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.266112" elapsed="0.000540"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.267659" elapsed="0.000579"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.269218" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.264375" elapsed="0.005260"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.263610" elapsed="0.006138"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.159454" elapsed="0.110403"/>
</kw>
<msg time="2026-04-07T17:19:00.270050" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.270101" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.158825" elapsed="0.111315"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.270338" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.270227" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.270206" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.272398" elapsed="0.000082"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.273266" elapsed="0.000056"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.273434" elapsed="0.000048"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.158132" elapsed="0.115577"/>
</kw>
<msg time="2026-04-07T17:19:00.273934" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.274811" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.153566" elapsed="0.121366"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.275733" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.275144" elapsed="0.000710"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.275101" elapsed="0.000810"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:00.153432" elapsed="0.122532"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:18:59.924346" elapsed="0.351719"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:18:59.921971" elapsed="0.354223"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:18:59.917257" elapsed="0.359065"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:18:59.916810" elapsed="0.359613"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:18:59.913749" elapsed="0.362791"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:00.292058" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:00.288210" elapsed="0.003888">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:18:59.913039" elapsed="0.379209">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t34" name="Modify the destination IP of Port In Old Owner After Recover" 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-07T17:19:00.295439" elapsed="0.000260"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:00.295180" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.296754" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.296641" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.296623" 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-07T17:19:00.301443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.301333" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.301315" elapsed="0.000198"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.302546" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:00.302134" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.303062" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:00.302732" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:00.303132" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:00.303289" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:00.301736" elapsed="0.001578"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.308543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.308432" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.308412" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.309855" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.309705" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.309687" elapsed="0.000255"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.310522" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.310145" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.310961" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.310706" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.343670" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.311543" elapsed="0.032287"/>
</kw>
<msg time="2026-04-07T17:19:00.344101" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.344150" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.311162" elapsed="0.033024"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.428274" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.344740" elapsed="0.083741"/>
</kw>
<msg time="2026-04-07T17:19:00.428652" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.428697" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.344353" elapsed="0.084380"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.429064" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.428813" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.428791" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.429685" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.429309" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.430067" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.429840" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.429822" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.430200" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.432543" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:19:00.434002" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.435394" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.431085" elapsed="0.004702"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.430488" elapsed="0.005412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.309405" elapsed="0.126610"/>
</kw>
<msg time="2026-04-07T17:19:00.436108" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.436177" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.308761" elapsed="0.127455"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.436401" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.436295" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.436275" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.436870" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.437263" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.437335" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.308092" elapsed="0.129351"/>
</kw>
<msg time="2026-04-07T17:19:00.437534" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.437577" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.303679" elapsed="0.133934"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.437931" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.437688" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.437671" elapsed="0.000370"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:00.303541" elapsed="0.134523"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.443487" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.443379" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.443359" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.444765" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.444658" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.444640" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.445345" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.444991" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.445767" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.445522" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.479532" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.446400" elapsed="0.033309"/>
</kw>
<msg time="2026-04-07T17:19:00.479878" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.479923" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.445945" elapsed="0.034013"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.577122" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.480563" elapsed="0.096755"/>
</kw>
<msg time="2026-04-07T17:19:00.577488" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.577533" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.480175" elapsed="0.097395"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.577871" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.577649" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.577628" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.578516" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.578146" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.578883" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.578673" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.578655" elapsed="0.000382"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.579070" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.581386" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:19:00.582833" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.584244" elapsed="0.000438"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.579927" elapsed="0.004827"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.579352" elapsed="0.005516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.444356" elapsed="0.140644"/>
</kw>
<msg time="2026-04-07T17:19:00.585097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.585141" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.443702" elapsed="0.141476"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.585363" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.585255" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.585236" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.585826" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.586184" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.586257" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.443033" elapsed="0.143331"/>
</kw>
<msg time="2026-04-07T17:19:00.586457" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.586500" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.438322" elapsed="0.148214"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.586855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.586611" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.586594" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:00.438187" elapsed="0.148767"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.592378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.592271" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.592251" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.593668" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.593562" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.593545" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.594263" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.593872" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.594690" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.594441" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.626887" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.595269" elapsed="0.031807"/>
</kw>
<msg time="2026-04-07T17:19:00.627258" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.627306" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.594868" elapsed="0.032475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.715170" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.627943" elapsed="0.087430"/>
</kw>
<msg time="2026-04-07T17:19:00.715544" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.715589" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.627548" elapsed="0.088078"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.715947" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.715706" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.715685" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.716614" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.716227" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.717013" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.716780" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.716760" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.717149" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.719494" elapsed="0.000573"/>
</kw>
<kw name="Open 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-07T17:19:00.720994" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.722401" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.717999" elapsed="0.004805"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.717405" elapsed="0.005517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.593263" elapsed="0.129778"/>
</kw>
<msg time="2026-04-07T17:19:00.723137" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.723180" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.592592" elapsed="0.130625"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.723404" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.723295" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.723275" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.723876" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.724239" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.724313" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.591915" elapsed="0.132507"/>
</kw>
<msg time="2026-04-07T17:19:00.724516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.724560" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.587233" elapsed="0.137364"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.724919" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.724671" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.724653" elapsed="0.000414"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:00.587097" elapsed="0.138000"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:00.303368" elapsed="0.421761"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:00.300961" elapsed="0.424227"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:00.296352" elapsed="0.428894"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.295902" elapsed="0.429391"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:00.293152" elapsed="0.432197"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:00.733538" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:19:00.729677" elapsed="0.003937">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:19:00.292544" elapsed="0.441227">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t35" name="Verify Port Is Modified After Recover" 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-07T17:19:00.737401" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:00.737142" elapsed="0.000520"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.738636" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.738527" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.738509" 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-07T17:19:00.743258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.743151" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.743133" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.744421" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:00.743909" elapsed="0.000540"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.744917" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:00.744609" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:00.745009" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:19:00.745170" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:00.743539" elapsed="0.001655"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.750377" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.750267" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.750248" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.751630" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.751523" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.751506" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.752206" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.751833" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.752659" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.752410" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.784571" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.753238" elapsed="0.031595"/>
</kw>
<msg time="2026-04-07T17:19:00.785139" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.785209" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.752839" elapsed="0.032425"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.838133" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.786452" elapsed="0.051876"/>
</kw>
<msg time="2026-04-07T17:19:00.838501" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.838548" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.785821" elapsed="0.052764"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.838894" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.838667" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.838646" elapsed="0.000384"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.839547" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.839170" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.839913" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.839700" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.839682" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.840064" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.842404" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.843853" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.845271" elapsed="0.000351"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.840907" elapsed="0.004789"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.840329" elapsed="0.005484"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.751223" elapsed="0.094690"/>
</kw>
<msg time="2026-04-07T17:19:00.846024" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.846069" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.750592" elapsed="0.095515"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.846296" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.846186" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.846167" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.846773" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.847126" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.847199" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.749915" elapsed="0.097392"/>
</kw>
<msg time="2026-04-07T17:19:00.847401" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.847445" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.745554" elapsed="0.101929"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.847801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.847557" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.847540" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:00.745418" elapsed="0.102519"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.853191" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.853081" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.853062" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.854477" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.854370" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.854352" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.855052" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.854683" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.855478" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.855231" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.890998" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.856050" elapsed="0.035125"/>
</kw>
<msg time="2026-04-07T17:19:00.891344" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.891391" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.855658" elapsed="0.035769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.947023" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.892000" elapsed="0.055219"/>
</kw>
<msg time="2026-04-07T17:19:00.947388" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:00.947433" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.891595" elapsed="0.055874"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.947769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.947548" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.947527" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:00.948398" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:00.948029" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.948758" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.948549" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.948531" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:00.948887" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:00.951194" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.952614" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:00.954023" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:00.949728" elapsed="0.004686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:00.949162" elapsed="0.005366"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.854065" elapsed="0.100560"/>
</kw>
<msg time="2026-04-07T17:19:00.954715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.954758" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.853407" elapsed="0.101388"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:00.955058" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:00.954935" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.954914" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.955515" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.955838" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.955908" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.852697" elapsed="0.103334"/>
</kw>
<msg time="2026-04-07T17:19:00.956125" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:00.956168" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.848223" elapsed="0.107982"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:00.956521" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:00.956280" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.956263" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:00.848084" elapsed="0.108537"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.962004" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.961878" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.961858" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:00.963287" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:00.963180" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:00.963161" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:00.963840" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:00.963491" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.964309" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:00.964063" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:00.995696" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:00.964863" elapsed="0.031024"/>
</kw>
<msg time="2026-04-07T17:19:00.996094" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:00.996141" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.964489" elapsed="0.031688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:01.051731" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:00.996729" elapsed="0.055195"/>
</kw>
<msg time="2026-04-07T17:19:01.052146" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:01.052192" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.996344" elapsed="0.055885"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.052528" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:01.052309" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:01.052287" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.053154" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:01.052768" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.053556" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:01.053345" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:01.053327" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:01.053689" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:01.055986" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:19:01.057434" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:01.058818" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:01.054524" elapsed="0.004701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:01.053940" elapsed="0.005401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:00.962831" elapsed="0.096610"/>
</kw>
<msg time="2026-04-07T17:19:01.059532" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:01.059575" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.962223" elapsed="0.097389"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:01.059793" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:01.059687" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:01.059669" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.060289" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.060615" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:01.060685" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:00.961534" elapsed="0.099257"/>
</kw>
<msg time="2026-04-07T17:19:01.060883" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:01.060927" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.956873" elapsed="0.104095"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.061315" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:01.061070" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:01.061053" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:00.956739" elapsed="0.104676"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:00.745248" elapsed="0.316196"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:00.742773" elapsed="0.318728"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:00.738240" elapsed="0.323319"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:00.737806" elapsed="0.323798"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:00.734973" elapsed="0.326685"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.069779" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:01.069423" elapsed="0.000383"/>
</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-07T17:19:01.079514" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:01.079136" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.080056" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:01.079733" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:01.080126" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:01.080278" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:01.078750" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.085595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:01.085299" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:01.085666" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:01.085813" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:01.084940" elapsed="0.000897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.092034" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:01.091762" elapsed="0.000319"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:01.092497" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:01.092231" elapsed="0.000311"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:01.109253" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:01.109410" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:01.109521" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:01.094651" elapsed="0.015300">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:01.092611" elapsed="0.017446">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.110243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:01.110092" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:01.092591" elapsed="0.017740">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.110703" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:01.110834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:01.110799" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:01.110781" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:01.111054" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:01.111126" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:01.086181" elapsed="0.025053">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:01.111294" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:19:01.084458" elapsed="0.026929">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:01.111656" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:01.080505" elapsed="0.031229">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:01.080370" elapsed="0.031423">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:01.078109" elapsed="0.033776">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:02.126820" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:02.126337" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:02.127356" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:02.127040" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:02.127431" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:19:02.127606" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:02.125916" elapsed="0.001715"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:02.132994" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:02.132677" elapsed="0.000346"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:02.133069" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:02.133216" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:02.132328" elapsed="0.000913"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:02.139669" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:02.139406" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:02.140132" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:02.139867" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:02.149509" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:02.149666" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:02.149775" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:02.142185" elapsed="0.008029">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:02.140270" elapsed="0.010030">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:02.150487" elapsed="0.000082"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:02.150335" elapsed="0.000281"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:02.140246" elapsed="0.010394">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:02.151028" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:02.151160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:02.151125" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:02.151108" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:02.151365" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:02.151434" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:02.133587" elapsed="0.017952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:02.151600" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:19:02.131807" elapsed="0.019886">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:02.151923" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:02.127835" elapsed="0.024180">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:02.127689" elapsed="0.024385">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:02.125110" elapsed="0.027061">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:03.168466" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:03.167989" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:03.168999" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:03.168667" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:03.169076" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:03.169249" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:03.167588" elapsed="0.001686"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:03.174583" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:03.174283" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:03.174655" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:03.174800" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:03.173905" elapsed="0.000919"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:03.181258" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:03.181001" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:03.181695" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:03.181454" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:03.190680" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:03.190817" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:03.190920" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:03.183829" elapsed="0.007564">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:03.181890" elapsed="0.009616">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:03.191765" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:03.191555" elapsed="0.000301"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:03.181869" elapsed="0.010020">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:03.192419" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:03.192605" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:03.192554" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:03.192530" elapsed="0.000164"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:03.192891" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:03.193010" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:03.175180" elapsed="0.017977">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:03.193241" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:19:03.173429" elapsed="0.019942">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:03.193690" elapsed="0.000035"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:03.169473" elapsed="0.024325">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:03.169332" elapsed="0.024547">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:03.166639" elapsed="0.027390">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:04.211465" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:04.210811" elapsed="0.000688"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:04.212088" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:04.211752" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:04.212164" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:04.212336" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:04.210276" elapsed="0.002085"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:04.217662" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:04.217365" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:04.217735" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:04.217882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:04.217018" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:04.224332" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:04.224076" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:04.224766" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:04.224526" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:04.233721" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:04.233865" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:04.233993" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:04.226798" elapsed="0.007583">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:04.224882" elapsed="0.009581">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:04.234649" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:04.234498" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:04.224861" elapsed="0.009877">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:04.235125" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:04.235292" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:04.235252" elapsed="0.000083"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:04.235233" elapsed="0.000124"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:04.235496" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:04.235566" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:04.218261" elapsed="0.017408">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:04.235731" elapsed="0.000047"/>
</return>
<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="FAIL" start="2026-04-07T17:19:04.216513" elapsed="0.019349">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:04.236117" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:04.212563" elapsed="0.023633">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:04.212418" elapsed="0.023863">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:04.209203" elapsed="0.027207">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:05.251955" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:05.251550" elapsed="0.000450"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:05.252465" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:05.252160" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:05.252536" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:05.252692" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:05.251114" elapsed="0.001603"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:05.258048" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:05.257727" elapsed="0.000348"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:05.258121" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:05.258269" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:05.257388" elapsed="0.000905"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:05.264838" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:05.264589" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:05.265300" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:05.265057" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:05.274043" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:05.274164" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:05.274258" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:05.267379" elapsed="0.007232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:05.265411" elapsed="0.009279">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:05.274953" elapsed="0.000042"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:05.274797" elapsed="0.000243"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:05.265393" elapsed="0.009671">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:05.275489" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:05.275673" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:05.275623" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:05.275599" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:05.275952" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:05.276074" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:05.258644" elapsed="0.017575">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:05.276305" elapsed="0.000024"/>
</return>
<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="FAIL" start="2026-04-07T17:19:05.256883" elapsed="0.019553">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:05.276751" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:05.252905" elapsed="0.023952">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:05.252769" elapsed="0.024168">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:05.250099" elapsed="0.026989">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:06.293626" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:06.293047" elapsed="0.000611"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.294156" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:06.293825" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:06.294230" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:06.294406" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:06.292486" elapsed="0.001945"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.299862" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:06.299566" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:06.299934" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:06.300096" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.299171" elapsed="0.000950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.306489" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.306233" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.306926" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.306686" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:06.315063" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:06.315206" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:06.315309" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.309062" elapsed="0.006627">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:06.307160" elapsed="0.008612">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.315956" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.315805" elapsed="0.000236"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:06.307140" elapsed="0.008925">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.316430" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.316563" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.316526" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:06.316509" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.316765" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.316835" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.300455" elapsed="0.016483">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.317017" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:19:06.298673" elapsed="0.018439">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:06.317384" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:06.294625" elapsed="0.022837">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:06.294486" elapsed="0.023035">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.291441" elapsed="0.026172">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:19:06.317710" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:19:01.070027" elapsed="5.247808">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:01.067447" elapsed="5.250502">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:00.734393" elapsed="5.583723">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff3d943fd-5b5d-45c3-80db-5eaef391c282%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s1-s2-t36" name="Delete Port In Old Owner After Recover" line="173">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:06.323314" elapsed="0.000299"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:06.322927" elapsed="0.000764"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.325090" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.324913" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.324887" elapsed="0.000299"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.330251" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.330143" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.330125" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.331304" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:06.330904" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.331788" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:06.331486" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:06.331859" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:06.332031" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:06.330536" elapsed="0.001520"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.337092" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.336982" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.336950" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.338399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.338292" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.338275" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.338988" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.338606" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.339428" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.339174" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.372499" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.340011" elapsed="0.032666"/>
</kw>
<msg time="2026-04-07T17:19:06.372849" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.372895" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.339610" elapsed="0.033322"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.429269" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.373519" elapsed="0.055976"/>
</kw>
<msg time="2026-04-07T17:19:06.429664" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:06.429709" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.373128" elapsed="0.056618"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.430087" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.429823" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.429803" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.430695" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.430328" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.431076" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.430847" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.430829" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:06.431208" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:06.433520" elapsed="0.000544"/>
</kw>
<kw name="Open 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-07T17:19:06.435000" elapsed="0.000602"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:06.436528" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.432061" elapsed="0.004868"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:06.431473" elapsed="0.005590"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.337990" elapsed="0.099173"/>
</kw>
<msg time="2026-04-07T17:19:06.437254" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.437297" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.337305" elapsed="0.100029"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:06.437517" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:06.437411" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.437392" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.438044" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.438382" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.438455" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.336636" elapsed="0.101927"/>
</kw>
<msg time="2026-04-07T17:19:06.438656" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.438700" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.332414" elapsed="0.106323"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.439091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.438812" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.438795" elapsed="0.000377"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:06.332273" elapsed="0.106921"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.444405" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.444299" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.444280" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.445693" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.445587" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.445569" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.446308" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.445898" elapsed="0.000438"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.446734" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.446490" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.476069" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.447320" elapsed="0.028908"/>
</kw>
<msg time="2026-04-07T17:19:06.476397" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.476443" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.446914" elapsed="0.029566"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.531753" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.477050" elapsed="0.054908"/>
</kw>
<msg time="2026-04-07T17:19:06.532150" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:06.532197" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.476646" elapsed="0.055586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.532532" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.532310" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.532290" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.533173" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.532769" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.533536" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.533325" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.533306" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:06.533666" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:06.535992" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.537437" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:06.538855" elapsed="0.000478"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.534525" elapsed="0.004881"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:06.533914" elapsed="0.005605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.445289" elapsed="0.094328"/>
</kw>
<msg time="2026-04-07T17:19:06.539710" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.539753" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.444652" elapsed="0.095138"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:06.539990" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:06.539868" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.539848" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.540458" elapsed="0.000060"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.540825" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.540896" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.443950" elapsed="0.097083"/>
</kw>
<msg time="2026-04-07T17:19:06.541127" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.541170" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.439451" elapsed="0.101755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.541524" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.541281" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.541264" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:06.439314" elapsed="0.102309"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.546800" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.546692" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.546673" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.548181" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.548075" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.548057" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.548732" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.548385" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.549171" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.548908" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.580369" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.549726" elapsed="0.030798"/>
</kw>
<msg time="2026-04-07T17:19:06.580706" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.580753" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.549351" elapsed="0.031438"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.645982" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.581423" elapsed="0.064754"/>
</kw>
<msg time="2026-04-07T17:19:06.646375" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:06.646427" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.580953" elapsed="0.065511"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.646765" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.646545" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.646523" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.647425" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.647026" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.647787" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.647576" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.647558" elapsed="0.000366"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:06.647958" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:06.650273" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:19:06.651716" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:06.653127" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.648814" elapsed="0.004705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:06.648240" elapsed="0.005395"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.547747" elapsed="0.105987"/>
</kw>
<msg time="2026-04-07T17:19:06.653824" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.653869" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.547140" elapsed="0.106766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:06.654111" elapsed="0.000053"/>
</return>
<status status="PASS" start="2026-04-07T17:19:06.654003" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.653967" elapsed="0.000263"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.654613" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.655130" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.655228" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.546336" elapsed="0.109003"/>
</kw>
<msg time="2026-04-07T17:19:06.655432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.655474" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.541874" elapsed="0.113635"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.655824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.655582" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.655565" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:06.541741" elapsed="0.114182"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:06.332107" elapsed="0.323844"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:06.329765" elapsed="0.326279"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:06.324515" elapsed="0.331585"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.323897" elapsed="0.332247"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:06.319669" elapsed="0.336527"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:06.667815" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.664042" elapsed="0.003811">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.318742" elapsed="0.349277">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t37" name="Delete Bridge In Old Owner And Verify After Recover" 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-07T17:19:06.671195" elapsed="0.000243"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:06.670921" elapsed="0.000570"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.672462" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.672349" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.672331" 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-07T17:19:06.677092" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.676982" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.676951" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.678155" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:06.677760" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.678639" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:06.678337" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:06.678708" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:06.678860" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:06.677376" elapsed="0.001508"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.684136" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.684027" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.684007" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.685386" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.685281" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.685263" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.685939" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.685590" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.686385" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.686138" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.714902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.686938" elapsed="0.028144"/>
</kw>
<msg time="2026-04-07T17:19:06.715251" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.715297" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.686564" elapsed="0.028769"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.790959" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.715906" elapsed="0.075267"/>
</kw>
<msg time="2026-04-07T17:19:06.791339" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:06.791384" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.715502" elapsed="0.075919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.791717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.791499" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.791479" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.792386" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.791955" elapsed="0.000528"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.792761" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.792550" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.792532" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:06.792925" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:06.795230" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.796706" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:06.798124" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.793773" elapsed="0.004749"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:06.793200" elapsed="0.005435"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.684957" elapsed="0.113778"/>
</kw>
<msg time="2026-04-07T17:19:06.798826" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.798870" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.684350" elapsed="0.114557"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:06.799109" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:06.799001" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.798969" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.799567" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.799891" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.799962" elapsed="0.000032"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.683676" elapsed="0.116434"/>
</kw>
<msg time="2026-04-07T17:19:06.800204" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.800247" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.679264" elapsed="0.121020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.800603" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.800360" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.800342" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:06.679126" elapsed="0.121576"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.807880" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.807774" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.807755" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.809216" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.809111" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.809093" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.809772" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.809420" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.810215" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.809948" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.841901" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.810768" elapsed="0.031390"/>
</kw>
<msg time="2026-04-07T17:19:06.842364" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.842412" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.810394" elapsed="0.032054"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.913987" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.843093" elapsed="0.071211"/>
</kw>
<msg time="2026-04-07T17:19:06.914474" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:06.914520" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.842644" elapsed="0.071912"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.914851" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.914635" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.914613" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:06.915485" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:06.915112" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.915849" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.915639" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.915621" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:06.915997" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:06.918313" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:19:06.919736" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:06.921170" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:06.916849" elapsed="0.004717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:06.916260" elapsed="0.005420"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.808787" elapsed="0.112991"/>
</kw>
<msg time="2026-04-07T17:19:06.921867" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.921910" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.808172" elapsed="0.113776"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:06.922148" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:06.922041" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.922022" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.922605" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.922924" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.923013" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.807438" elapsed="0.115682"/>
</kw>
<msg time="2026-04-07T17:19:06.923211" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:06.923254" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.800956" elapsed="0.122334"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:06.923604" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:06.923364" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.923347" elapsed="0.000333"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:06.800822" elapsed="0.122881"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.929157" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.929051" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.929032" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:06.930399" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:06.930294" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:06.930276" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:06.930952" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:06.930602" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.931412" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:06.931165" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:06.962159" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:06.932028" elapsed="0.030304"/>
</kw>
<msg time="2026-04-07T17:19:06.962503" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:06.962549" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.931590" elapsed="0.030996"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.042335" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:06.963147" elapsed="0.079384"/>
</kw>
<msg time="2026-04-07T17:19:07.042698" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:07.042743" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.962750" elapsed="0.080029"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.043094" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.042856" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.042836" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.043700" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:07.043332" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.044084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.043856" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.043838" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:07.044217" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.046547" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:19:07.047991" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:07.049435" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:07.045085" elapsed="0.004748"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:07.044468" elapsed="0.005478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:06.929994" elapsed="0.120085"/>
</kw>
<msg time="2026-04-07T17:19:07.050169" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.050212" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.929369" elapsed="0.120880"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:07.050467" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:07.050360" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.050341" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.050922" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.051263" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.051333" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:06.928667" elapsed="0.122771"/>
</kw>
<msg time="2026-04-07T17:19:07.051529" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.051572" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.924032" elapsed="0.127576"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.051920" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.051681" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.051664" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:06.923862" elapsed="0.128175"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:06.678938" elapsed="0.373127"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:06.676614" elapsed="0.375506"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:06.672064" elapsed="0.380110"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:06.671634" elapsed="0.380584"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:06.668933" elapsed="0.383335"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:07.064016" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:07.060237" elapsed="0.003817">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:06.668380" elapsed="0.395816">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s1-s2-t38" name="Cleans Up Test Environment For Next Suite" 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-07T17:19:07.067341" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:07.067086" 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-07T17:19:07.068551" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.068444" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.068426" 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-07T17:19:07.073139" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.073033" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.073015" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.074221" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:07.073828" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.074702" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:07.074402" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:07.074771" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:07.074923" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:07.073426" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.080144" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.080036" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.080017" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.081380" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.081275" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.081257" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:07.081963" level="INFO">${karaf_connection_index} = 224</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:07.081614" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.082408" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:07.082162" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.112168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:07.082962" elapsed="0.029375"/>
</kw>
<msg time="2026-04-07T17:19:07.112503" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:07.112549" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.082587" elapsed="0.030000"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.168525" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:07.113191" elapsed="0.055666"/>
</kw>
<msg time="2026-04-07T17:19:07.169121" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:07.169170" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.112753" elapsed="0.056454"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.169646" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.169320" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.169287" elapsed="0.000465"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.170404" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:07.169895" elapsed="0.000598"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.170769" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.170559" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.170541" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:07.170905" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.173371" elapsed="0.000515"/>
</kw>
<kw name="Open 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-07T17:19:07.174867" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:07.176324" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:07.171849" elapsed="0.004881"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:07.171239" elapsed="0.005605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:07.080954" elapsed="0.095993"/>
</kw>
<msg time="2026-04-07T17:19:07.177059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.177105" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.080355" elapsed="0.096787"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:07.177422" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:07.177313" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.177293" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.177906" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.178301" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.178373" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:07.079653" elapsed="0.098835"/>
</kw>
<msg time="2026-04-07T17:19:07.178585" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.178628" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.075319" elapsed="0.103345"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.179006" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.178740" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.178724" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:07.075184" elapsed="0.103926"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.184551" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.184444" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.184426" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.185788" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.185682" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.185664" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:07.186429" level="INFO">${karaf_connection_index} = 226</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:07.186067" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.186866" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:07.186616" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.222667" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:07.187530" elapsed="0.035299"/>
</kw>
<msg time="2026-04-07T17:19:07.223013" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:07.223060" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.187149" elapsed="0.035948"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.285953" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:07.223649" elapsed="0.062508"/>
</kw>
<msg time="2026-04-07T17:19:07.286325" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:07.286370" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.223265" elapsed="0.063142"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.286717" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.286484" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.286464" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.287354" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:07.286957" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.287753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.287542" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.287524" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:07.287886" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.290181" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:19:07.291641" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:07.293042" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:07.288717" elapsed="0.004721"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:07.288152" elapsed="0.005401"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:07.185384" elapsed="0.108270"/>
</kw>
<msg time="2026-04-07T17:19:07.293744" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.293788" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.184766" elapsed="0.109058"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:07.294023" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:07.293900" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.293882" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.294489" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.294883" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.294956" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:07.184101" elapsed="0.110981"/>
</kw>
<msg time="2026-04-07T17:19:07.295173" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.295217" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.179387" elapsed="0.115866"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.295571" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.295326" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.295309" elapsed="0.000339"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:07.179247" elapsed="0.116425"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.301008" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.300875" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.300857" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.302253" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:07.302148" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.302130" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:07.302828" level="INFO">${karaf_connection_index} = 228</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:07.302457" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.303273" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:07.303024" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.336701" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:07.303833" elapsed="0.033043"/>
</kw>
<msg time="2026-04-07T17:19:07.337100" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:07.337148" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.303459" elapsed="0.033725"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.400792" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:07.337740" elapsed="0.063262"/>
</kw>
<msg time="2026-04-07T17:19:07.401172" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:07.401217" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.337350" elapsed="0.063904"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.401564" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.401332" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.401312" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.402193" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:07.401803" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.402563" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.402353" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.402335" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:07.402695" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.405017" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:19:07.406453" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:07.407872" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:07.403561" elapsed="0.004720"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:07.402944" elapsed="0.005451"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:07.301832" elapsed="0.106667"/>
</kw>
<msg time="2026-04-07T17:19:07.408588" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.408632" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.301224" elapsed="0.107445"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:07.408849" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:07.408744" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.408725" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.409328" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.409653" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:07.409725" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:07.300538" elapsed="0.109292"/>
</kw>
<msg time="2026-04-07T17:19:07.409919" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:07.409962" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.295925" elapsed="0.114106"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:07.410404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.410155" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.410137" elapsed="0.000350"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:07.295791" elapsed="0.114718"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:07.075018" elapsed="0.335520"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:07.072663" elapsed="0.337933"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:07.068164" elapsed="0.342487"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:07.067741" elapsed="0.342957"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:07.065101" elapsed="0.345651"/>
</kw>
<kw name="Configure Exit OVSDB Connection" owner="ClusterOvsdb">
<kw name="Clean OVSDB Test Environment" owner="OVSDB">
<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-07T17:19:07.416030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:07.415748" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:07.415730" elapsed="0.000381"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.416393" 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-07T17:19:07.416498" 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-07T17:19:07.416254" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.417076" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:19:07.416670" elapsed="0.000453"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.417643" level="INFO">${conn_id} = 369</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-07T17:19:07.417273" elapsed="0.000395"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:07.418845" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:07.418920" 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-07T17:19:07.418555" elapsed="0.000388"/>
</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-07T17:19:07.419119" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.420314" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:07.742278" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:18:52 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:07.420001" elapsed="0.322383"/>
</kw>
<msg time="2026-04-07T17:19:07.742447" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.419632" elapsed="0.322878"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:07.417882" elapsed="0.324719"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:07.743006" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:19:08.896199" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:08.896586" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:08.896690" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:07.742787" elapsed="1.153960"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:08.897401" elapsed="0.000651"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:08.899147" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:08.898469" elapsed="0.000801"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:08.899745" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:08.899449" elapsed="0.000404"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:08.899397" elapsed="0.000507"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:08.900295" elapsed="0.000069"/>
</return>
<status status="PASS" start="2026-04-07T17:19:08.900058" elapsed="0.000381"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:08.900020" elapsed="0.000476"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:08.900572" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:08.905026" elapsed="0.000454"/>
</kw>
<kw name="Open 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-07T17:19:08.905707" elapsed="0.000240"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:08.906177" elapsed="0.000140"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:08.901303" elapsed="0.005089"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:07.415228" elapsed="1.491298"/>
</kw>
<msg time="2026-04-07T17:19:08.906602" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:07.414651" elapsed="1.492024"/>
</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="PASS" start="2026-04-07T17:19:07.414158" elapsed="1.492630"/>
</kw>
<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-07T17:19:08.909666" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:08.909296" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:08.909270" elapsed="0.000509"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:08.910229" 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-07T17:19:08.910371" 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-07T17:19:08.910037" elapsed="0.000370"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:08.910960" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:19:08.910578" elapsed="0.000447"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:08.911541" level="INFO">${conn_id} = 371</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-07T17:19:08.911177" elapsed="0.000390"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:08.912455" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:08.912531" 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-07T17:19:08.912180" elapsed="0.000375"/>
</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-07T17:19:08.912705" elapsed="0.000329"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:08.913918" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:09.228189" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:07 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:08.913590" elapsed="0.314803"/>
</kw>
<msg time="2026-04-07T17:19:09.228479" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:08.913238" elapsed="0.315331"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:08.911775" elapsed="0.316925"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.229284" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:19:09.261414" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:19:09.261679" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:09.261782" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:09.228990" elapsed="0.032846"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:09.262263" elapsed="0.000477"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.263923" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:09.263260" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:09.264558" elapsed="0.000040"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:09.264248" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.264192" elapsed="0.000538"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:09.265135" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:19:09.264855" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.264820" elapsed="0.000512"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:09.265411" elapsed="0.000033"/>
</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-07T17:19:09.271567" elapsed="0.000587"/>
</kw>
<kw name="Open 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-07T17:19:09.272316" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:09.272621" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:09.266199" elapsed="0.006569"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:08.908541" elapsed="0.364318"/>
</kw>
<msg time="2026-04-07T17:19:09.272912" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:08.907740" elapsed="0.365222"/>
</kw>
<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="PASS" start="2026-04-07T17:19:08.907052" elapsed="0.366011"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:19:07.413630" elapsed="1.859490"/>
</kw>
<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-07T17:19:09.275196" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:09.274911" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.274892" elapsed="0.000404"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.275582" 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-07T17:19:09.275684" 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-07T17:19:09.275444" elapsed="0.000345"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.276347" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.56" 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-07T17:19:09.275941" elapsed="0.000452"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.276909" level="INFO">${conn_id} = 373</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-07T17:19:09.276544" elapsed="0.000391"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.277837" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:09.277914" 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-07T17:19:09.277560" elapsed="0.000378"/>
</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-07T17:19:09.278123" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.279313" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:09.590771" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:09 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:09.278953" elapsed="0.311906"/>
</kw>
<msg time="2026-04-07T17:19:09.590922" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:09.278607" elapsed="0.312397"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:09.277164" elapsed="0.313936"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.591461" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-04-07T17:19:09.644301" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:09.644539" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:09.644661" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:09.591278" elapsed="0.053436"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:09.645111" elapsed="0.000456"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.646549" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:09.645942" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:09.647095" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:09.646801" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.646755" elapsed="0.000495"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:09.647605" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:19:09.647369" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.647335" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:09.647865" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:09.653648" elapsed="0.000315"/>
</kw>
<kw name="Open 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-07T17:19:09.654142" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:09.654430" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:09.648551" elapsed="0.006025"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:09.274378" elapsed="0.380292"/>
</kw>
<msg time="2026-04-07T17:19:09.654723" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:09.273802" elapsed="0.380972"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl del-manager</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:09.273309" elapsed="0.381596"/>
</kw>
<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-07T17:19:09.657005" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:09.656727" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:09.656709" elapsed="0.000378"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.657361" 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-07T17:19:09.657460" 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-07T17:19:09.657231" elapsed="0.000255"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.658028" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.56" 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-07T17:19:09.657631" elapsed="0.000443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.658580" level="INFO">${conn_id} = 375</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-07T17:19:09.658225" elapsed="0.000380"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:09.659479" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:09.659553" 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-07T17:19:09.659217" elapsed="0.000360"/>
</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-07T17:19:09.659731" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.660909" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:09.982753" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:09 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:09.660572" elapsed="0.322264"/>
</kw>
<msg time="2026-04-07T17:19:09.982895" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:09.660224" elapsed="0.322728"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:09.658813" elapsed="0.324249"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:09.983408" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-04-07T17:19:10.138149" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:10.138406" level="INFO">${stdout} =  * Exiting ovs-vswitchd (4238)
 * Exiting ovsdb-server (4221)</msg>
<msg time="2026-04-07T17:19:10.138505" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:09.983231" elapsed="0.155325"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:10.138910" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.140365" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:10.139761" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:10.140932" elapsed="0.000072"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:10.140616" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.140567" elapsed="0.000561"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:10.141483" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:19:10.141247" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.141212" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:10.141739" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.147016" elapsed="0.000320"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:10.147564" elapsed="0.000160"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:10.147867" elapsed="0.000113"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:10.142445" elapsed="0.005591"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:09.656184" elapsed="0.491944"/>
</kw>
<msg time="2026-04-07T17:19:10.148183" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:09.655620" elapsed="0.492615"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl stop</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:09.655120" elapsed="0.493197"/>
</kw>
<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-07T17:19:10.150411" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:10.150128" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.150108" elapsed="0.000385"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.150771" 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-07T17:19:10.150874" 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-07T17:19:10.150635" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.151442" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.56" 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-07T17:19:10.151061" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.152026" level="INFO">${conn_id} = 377</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-07T17:19:10.151645" elapsed="0.000406"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.152917" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:10.153008" 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-07T17:19:10.152645" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.153184" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.154337" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:10.524332" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:09 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:10.154024" elapsed="0.370486"/>
</kw>
<msg time="2026-04-07T17:19:10.524606" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.153662" elapsed="0.371038"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:10.152260" elapsed="0.372572"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.525456" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-04-07T17:19:10.537950" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:10.538239" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:10.538335" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:10.525140" elapsed="0.013245"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:10.538883" elapsed="0.000496"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.540567" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:10.539872" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:10.541197" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:10.540854" elapsed="0.000457"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.540793" elapsed="0.000572"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:10.541721" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:19:10.541486" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.541451" elapsed="0.000454"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:10.542009" elapsed="0.000035"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.548121" elapsed="0.000621"/>
</kw>
<kw name="Open 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-07T17:19:10.548906" elapsed="0.000194"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:10.549245" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:10.542726" elapsed="0.006668"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:10.149586" elapsed="0.399902"/>
</kw>
<msg time="2026-04-07T17:19:10.549543" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.149027" elapsed="0.400568"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo rm -rf /etc/openvswitch/conf.db</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:10.148513" elapsed="0.401306"/>
</kw>
<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-07T17:19:10.551964" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:10.551689" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:10.551669" elapsed="0.000392"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.552361" 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-07T17:19:10.552465" 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-07T17:19:10.552209" elapsed="0.000282"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.553041" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.56" 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-07T17:19:10.552643" elapsed="0.000444"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.553608" level="INFO">${conn_id} = 379</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-07T17:19:10.553239" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:10.554539" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:10.554614" 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-07T17:19:10.554251" elapsed="0.000386"/>
</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-07T17:19:10.554804" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.558289" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:10.882651" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:10 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:10.555675" elapsed="0.327136"/>
</kw>
<msg time="2026-04-07T17:19:10.882880" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.555299" elapsed="0.327648"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:10.553844" elapsed="0.329218"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:10.883446" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-04-07T17:19:11.017290" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:11.017540" level="INFO">${stdout} =  * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * system ID not configured, please use --system-id
 * Configuring Open vSwitch ...</msg>
<msg time="2026-04-07T17:19:11.017643" level="INFO">${stderr} = 2026-04-07T17:19:10Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:19:10Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:19:11Z|00001|dns_res...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:10.883244" elapsed="0.134454"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.018099" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.019563" level="INFO">2026-04-07T17:19:10Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:19:10Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:19:11Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.018920" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.020136" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:11.019830" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.019784" elapsed="0.000508"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:11.020647" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:19:11.020411" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.020377" elapsed="0.000458"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.020911" elapsed="0.000033"/>
</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-07T17:19:11.026747" elapsed="0.000766"/>
</kw>
<kw name="Open 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-07T17:19:11.027867" elapsed="0.000369"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.028570" elapsed="0.000227"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.021666" elapsed="0.007249"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:10.551147" elapsed="0.478048"/>
</kw>
<msg time="2026-04-07T17:19:11.029321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:10.550551" elapsed="0.478878"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl start</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:10.550044" elapsed="0.479559"/>
</kw>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>General Use Keyword attempting to sanitize test environment for OVSDB related
tests. Not every step will always be neccessary, but should not cause any problems for
any new ovsdb test suites.</doc>
<status status="PASS" start="2026-04-07T17:19:07.413244" elapsed="3.616469"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.030226" level="INFO">${dictionary} = {'ovsdb://uuid': '0'}</msg>
<var>${dictionary}</var>
<arg>ovsdb://uuid=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.029891" elapsed="0.000362"/>
</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-07T17:19:11.036191" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:11.035790" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.036681" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:11.036376" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:11.036751" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:11.036905" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:11.035415" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.042820" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.042512" elapsed="0.000335"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.042893" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:11.043058" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.042159" elapsed="0.000925"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.049296" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.049031" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.049735" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.049493" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.058421" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node065ny3pzcgh23l4xybclrac7t41.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:11.058566" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:11.058661" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:11.051756" elapsed="0.006931"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.049845" elapsed="0.008884"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.058905" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.058756" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.049826" elapsed="0.009185"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.062510" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.060034" elapsed="0.002541"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.059793" elapsed="0.002830"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.059775" elapsed="0.002884"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.066054" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.063073" elapsed="0.003045"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.062741" elapsed="0.003426"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.062718" elapsed="0.003484"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.066994" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.066426" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.067455" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.067132" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.068222" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.067784" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.067568" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.067107" elapsed="0.001230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.069076" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.068551" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.069572" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.069249" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.070150" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.069835" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.069682" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.069185" elapsed="0.001049"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.070378" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:11.071196" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.070879" elapsed="0.000391"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.071426" elapsed="0.002292"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:11.059368" elapsed="0.014413"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:11.073958" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:19:11.073852" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.073833" elapsed="0.000229"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.074207" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.074279" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:11.076417" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:11.043420" elapsed="0.033025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:11.076498" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:11.076650" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:11.041584" elapsed="0.035091"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.077954" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:11.077555" elapsed="0.000483"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:19:11.077391" elapsed="0.000686"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:11.077215" elapsed="0.000895"/>
</for>
<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="PASS" start="2026-04-07T17:19:11.076916" elapsed="0.001246"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:11.037220" elapsed="0.040977"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.083443" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.083144" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.083515" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:11.083672" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.082783" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.089883" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.089636" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.090334" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.090091" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.104797" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0ptqi4nusp8mw1uyker47xnf2u1.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:11.105104" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:11.105345" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:11.092362" elapsed="0.013040"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.090448" elapsed="0.015051"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.105916" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.105564" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.090427" elapsed="0.015713"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.114010" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.108448" elapsed="0.005636"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.107935" elapsed="0.006202"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.107893" elapsed="0.006282"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.118264" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.114720" elapsed="0.003615"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.114384" elapsed="0.004004"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.114355" elapsed="0.004071"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.119307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.118692" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.119796" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.119448" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.120624" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.120176" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.119918" elapsed="0.000800"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.119422" elapsed="0.001330"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.121575" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.121001" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.121933" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.121704" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.122481" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.122186" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.122032" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.121685" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.122718" elapsed="0.000365"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:11.123548" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.123244" elapsed="0.000330"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.123731" elapsed="0.002164"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:11.106947" elapsed="0.019033"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:11.126171" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:19:11.126058" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.126039" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.126421" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.126492" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:11.128668" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:11.084060" elapsed="0.044635"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:11.128749" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:11.128902" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:11.082286" elapsed="0.046641"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.130279" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:11.129872" elapsed="0.000476"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:19:11.129710" elapsed="0.000678"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:11.129533" elapsed="0.000888"/>
</for>
<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="PASS" start="2026-04-07T17:19:11.129204" elapsed="0.001271"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:11.078288" elapsed="0.052222"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.135725" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.135427" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.135867" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:11.136037" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.135088" elapsed="0.000975"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.142253" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.141994" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.142691" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.142445" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.157531" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01hdifht41igjliyalvknwl0t31.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:11.157802" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:11.158040" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:11.144914" elapsed="0.013186"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.142809" elapsed="0.015387"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.158593" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.158258" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.142788" elapsed="0.015996"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.166137" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.161077" elapsed="0.005162"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.160573" elapsed="0.005744"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.160532" elapsed="0.005841"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.170076" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.166857" elapsed="0.003286"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.166495" elapsed="0.003697"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.166457" elapsed="0.003773"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.171087" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.170481" elapsed="0.000646"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.171572" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.171231" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.172383" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.171921" elapsed="0.000500"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.171692" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.171204" elapsed="0.001301"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.173276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.172728" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.174181" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.173415" elapsed="0.000854"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.174871" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.174531" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.174305" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.173389" elapsed="0.001563"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.175118" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:11.175928" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:11.175621" elapsed="0.000333"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.176122" elapsed="0.002170"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:11.159603" elapsed="0.018855"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:11.178650" elapsed="0.000043"/>
</return>
<status status="PASS" start="2026-04-07T17:19:11.178535" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.178516" elapsed="0.000237"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.178899" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.178985" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:19:11.181118" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:11.136407" elapsed="0.044739"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:11.181199" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:11.181354" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:11.134579" elapsed="0.046805"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.182647" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:11.182262" elapsed="0.000455"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:19:11.182109" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:11.181936" elapsed="0.000852"/>
</for>
<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="PASS" start="2026-04-07T17:19:11.181652" elapsed="0.001189"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:11.130603" elapsed="0.052273"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:11.037051" elapsed="0.145857"/>
</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 {'ovsdb://uuid': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:19:11.034838" elapsed="0.148130"/>
</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-07T17:19:11.030431" elapsed="0.152622"/>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="PASS" start="2026-04-07T17:19:07.410987" elapsed="3.772138"/>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="PASS" start="2026-04-07T17:19:07.064534" elapsed="4.118713"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-07T17:19:11.184183" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-07T17:19:11.184098" elapsed="0.000210"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Candidate failover and recover</doc>
<status status="FAIL" start="2026-04-07T17:17:39.443828" elapsed="91.740514"/>
</suite>
<status status="FAIL" start="2026-04-07T17:15:51.342300" elapsed="199.843255"/>
</suite>
<suite id="s1-s2" name="Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster">
<suite id="s1-s2-s1" name="Ovsdb Southbound Cluster" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster/010__Ovsdb_Southbound_Cluster.robot">
<kw name="Suite Setup" 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-07T17:19:11.266747" 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-07T17:19:11.262738" elapsed="0.004071"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-07T17:19:11.262473" elapsed="0.004417"/>
</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-07T17:19:11.271550" 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-07T17:19:11.268076" elapsed="0.003501"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-07T17:19:11.271821" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:11.271679" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.271645" elapsed="0.000253"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.272419" 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-07T17:19:11.272067" elapsed="0.000394"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.272931" level="INFO">${cluster_size} = 3</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-07T17:19:11.272618" 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-07T17:19:11.273489" elapsed="0.000323"/>
</kw>
<msg time="2026-04-07T17:19:11.273912" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:11.273959" level="INFO">${possibly_int_of_members} = 3</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-07T17:19:11.273138" elapsed="0.000951"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.274633" level="INFO">${int_of_members} = 3</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-07T17:19:11.274260" elapsed="0.000406"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.275672" 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-07T17:19:11.275409" elapsed="0.000291"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.276154" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:11.275866" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.276631" 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-07T17:19:11.276340" elapsed="0.000317"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.279669" elapsed="0.000235"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.280399" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.280077" elapsed="0.000348"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.280573" elapsed="0.000231"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.281591" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.281297" elapsed="0.000319"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.281664" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:11.282089" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.281010" elapsed="0.001117"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.283024" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.175:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899d68890&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:19:11.282328" elapsed="0.000867"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.283354" elapsed="0.000192"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:19:11.279113" elapsed="0.004491"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:11.278907" elapsed="0.004743"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.284519" elapsed="0.000188"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.285205" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.284857" elapsed="0.000377"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.285380" elapsed="0.000216"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.286405" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.286110" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.286476" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:11.286625" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.285779" elapsed="0.000870"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.287216" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.171.205:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899b93e10&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:19:11.286795" elapsed="0.000529"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.287481" elapsed="0.000194"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:19:11.283949" elapsed="0.003796"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:11.283755" elapsed="0.004104"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.288692" elapsed="0.000187"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.289368" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.289047" elapsed="0.000347"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.289538" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.290552" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:11.290259" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:11.290623" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:11.290777" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.289955" elapsed="0.000847"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:11.291372" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.206:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a017aad0&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:19:11.290951" elapsed="0.000526"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.291633" elapsed="0.000187"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:19:11.288144" elapsed="0.003734"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:11.287949" elapsed="0.003973"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-07T17:19:11.276720" elapsed="0.015232"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.292525" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</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-07T17:19:11.292131" elapsed="0.000436"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.293132" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.175', 2: '10.30.171.205', 3: '10.30.170.206'}</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-07T17:19:11.292722" elapsed="0.000453"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.293714" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</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-07T17:19:11.293330" elapsed="0.000425"/>
</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-07T17:19:11.274943" elapsed="0.018896"/>
</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-07T17:19:11.267694" elapsed="0.026205"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.294093" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:11.293964" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.293945" elapsed="0.000215"/>
</if>
<kw name="Run_Bash_Command_On_List_Or_All" owner="ClusterManagement">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.297319" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:11.296924" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.297799" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:11.297499" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:11.297881" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:11.298051" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:11.296604" elapsed="0.001472"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:11.299079" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.298801" elapsed="0.000305"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.300033" 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-07T17:19:11.300138" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.299759" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.303707" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.303046" elapsed="0.000789"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.303000" elapsed="0.000905"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.304579" 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-07T17:19:11.304849" 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-07T17:19:11.304201" elapsed="0.000745"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.305857" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.175" 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-07T17:19:11.305230" elapsed="0.000802"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.307078" level="INFO">${conn_id} = 381</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-07T17:19:11.306300" elapsed="0.000877"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.308587" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:11.308663" 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-07T17:19:11.308315" elapsed="0.000371"/>
</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-07T17:19:11.308885" elapsed="0.000420"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.310369" level="INFO">Logging into '10.30.170.175:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:11.911841" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:19:11 UTC 2026

  System load:  0.12               Processes:             125
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.175
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:40 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:11.310037" elapsed="0.602196"/>
</kw>
<msg time="2026-04-07T17:19:11.912422" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.309513" elapsed="0.603086"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:11.307532" elapsed="0.605525"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.914547" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:19:11.927392" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:19:11.927909" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:11.928198" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:11.913685" elapsed="0.014686"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.928910" elapsed="0.001419"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.933522" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.931942" elapsed="0.002009"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.935145" elapsed="0.000077"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:11.934383" elapsed="0.000956"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.934256" elapsed="0.001269"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:11.936791" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-04-07T17:19:11.935963" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.935854" elapsed="0.001221"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:11.937179" elapsed="0.000017"/>
</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-07T17:19:11.940586" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:19:11.941385" elapsed="0.000247"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.941881" elapsed="0.000191"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.937802" elapsed="0.004352"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:11.302016" elapsed="0.640418"/>
</kw>
<msg time="2026-04-07T17:19:11.942557" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.301302" elapsed="0.641313"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:19:11.300818" elapsed="0.641879"/>
</kw>
<msg time="2026-04-07T17:19:11.942738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.300320" elapsed="0.642464"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.945550" elapsed="0.000312"/>
</kw>
<kw name="Open 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-07T17:19:11.946038" elapsed="0.000147"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.946327" elapsed="0.000096"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:11.943088" elapsed="0.003386"/>
</kw>
<msg time="2026-04-07T17:19:11.946565" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:19:11.299317" elapsed="0.647273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.947031" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:11.946768" elapsed="0.000305"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:19:11.947114" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:19:11.298421" elapsed="0.648815"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:11.298250" elapsed="0.649024"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:11.948266" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:11.947988" elapsed="0.000304"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.949051" 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-07T17:19:11.949153" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:11.948859" elapsed="0.000320"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:11.953275" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:11.952477" elapsed="0.000912"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:11.952431" elapsed="0.001034"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.954186" 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-07T17:19:11.954483" 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-07T17:19:11.953751" elapsed="0.000847"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.955623" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.205" 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-07T17:19:11.954932" elapsed="0.000899"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.956947" level="INFO">${conn_id} = 384</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-07T17:19:11.956141" elapsed="0.000936"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:11.958666" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:11.958743" 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-07T17:19:11.958369" elapsed="0.000397"/>
</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-07T17:19:11.958985" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:11.960267" level="INFO">Logging into '10.30.171.205:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:12.557803" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:19:12 UTC 2026

  System load:  0.35               Processes:             124
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.205
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:40 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:11.959924" elapsed="0.598093"/>
</kw>
<msg time="2026-04-07T17:19:12.558110" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.959522" elapsed="0.598682"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:11.957465" elapsed="0.601008"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:12.559401" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:19:12.572281" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:19:12.572711" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:12.572923" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:12.558866" elapsed="0.014305"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:12.573643" elapsed="0.001101"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:12.577270" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:12.576047" elapsed="0.001610"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:12.578641" elapsed="0.000065"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:12.578022" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:12.577884" elapsed="0.001068"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:12.579826" elapsed="0.000134"/>
</return>
<status status="PASS" start="2026-04-07T17:19:12.579277" elapsed="0.000821"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:12.579189" elapsed="0.001062"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:12.580446" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.586643" elapsed="0.000423"/>
</kw>
<kw name="Open 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-07T17:19:12.587316" elapsed="0.000232"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:12.587790" elapsed="0.000161"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:12.581831" elapsed="0.006218"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:11.951298" elapsed="0.637008"/>
</kw>
<msg time="2026-04-07T17:19:12.588488" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.950588" elapsed="0.637955"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:19:11.950099" elapsed="0.638522"/>
</kw>
<msg time="2026-04-07T17:19:12.588661" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:11.949330" elapsed="0.639375"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.591303" elapsed="0.000309"/>
</kw>
<kw name="Open 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-07T17:19:12.591770" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:12.592077" elapsed="0.000098"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:12.589058" elapsed="0.003169"/>
</kw>
<msg time="2026-04-07T17:19:12.592318" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:19:11.948503" elapsed="0.643839"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:12.592761" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:12.592514" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:19:12.592843" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:19:11.947561" elapsed="0.645402"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:11.947377" elapsed="0.645658"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:12.594040" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:12.593748" elapsed="0.000318"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:12.594768" 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-07T17:19:12.594866" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:12.594629" elapsed="0.000262"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:12.598500" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:12.597846" elapsed="0.000759"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:12.597802" elapsed="0.000871"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:12.599328" 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-07T17:19:12.599601" 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-07T17:19:12.598937" elapsed="0.000765"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:12.600603" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" 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-07T17:19:12.599984" elapsed="0.000778"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:12.601833" level="INFO">${conn_id} = 387</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-07T17:19:12.601043" elapsed="0.000892"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:12.603354" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:12.603430" 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-07T17:19:12.603064" elapsed="0.000389"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.603651" elapsed="0.000336"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:12.605063" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:13.215951" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:19:12 UTC 2026

  System load:  0.12               Processes:             123
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:17:41 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:12.604721" elapsed="0.611521"/>
</kw>
<msg time="2026-04-07T17:19:13.216328" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.604198" elapsed="0.612213"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:12.602339" elapsed="0.614884"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.218158" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:19:13.230810" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:19:13.231572" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:13.231925" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:13.217613" elapsed="0.014601"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.232907" elapsed="0.001304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.236950" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.235680" elapsed="0.001803"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.238573" elapsed="0.000073"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.237835" elapsed="0.000917"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.237722" elapsed="0.001120"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:13.239296" elapsed="0.000078"/>
</return>
<status status="PASS" start="2026-04-07T17:19:13.239009" elapsed="0.000418"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.238951" elapsed="0.000552"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.239605" elapsed="0.000017"/>
</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-07T17:19:13.243107" elapsed="0.000411"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.243789" elapsed="0.000261"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.244304" elapsed="0.000177"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.240259" elapsed="0.004303"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:12.596674" elapsed="0.648176"/>
</kw>
<msg time="2026-04-07T17:19:13.245087" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.596041" elapsed="0.649109"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:19:12.595550" elapsed="0.649684"/>
</kw>
<msg time="2026-04-07T17:19:13.245274" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:12.595057" elapsed="0.650263"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:13.247866" elapsed="0.000328"/>
</kw>
<kw name="Open 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-07T17:19:13.248355" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.248644" elapsed="0.000097"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.245611" elapsed="0.003181"/>
</kw>
<msg time="2026-04-07T17:19:13.248886" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:19:12.594278" elapsed="0.654852"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.249584" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.249329" elapsed="0.000297"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:19:13.249670" elapsed="0.000030"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:19:12.593384" elapsed="0.656412"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:12.593154" elapsed="0.656680"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:11.298126" elapsed="1.951745"/>
</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-07T17:19:11.294374" elapsed="1.955559"/>
</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-07T17:19:13.250101" elapsed="0.000214"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.263470" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.263344" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.263321" elapsed="0.000223"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.263872" 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-07T17:19:13.263999" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.263710" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.264446" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.264178" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.264877" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.264636" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.265788" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:19:13.265550" elapsed="0.000355">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-07T17:19:13.266027" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:13.266073" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.265100" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:13.266393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:13.266172" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.266153" elapsed="0.000338"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.268894" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.268107" elapsed="0.000883"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:13.269125" elapsed="0.000090"/>
</return>
<msg time="2026-04-07T17:19:13.269502" level="INFO">${odl_ip} = 10.30.170.175</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.267190" elapsed="0.002366"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.269905" elapsed="0.001118"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.271753" level="INFO">index=390
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:19:13.272013" level="INFO">${karaf_connection_object} = index=390
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.271407" elapsed="0.000671"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.272404" elapsed="0.003695"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.276542" level="INFO">Logging into '10.30.170.175:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:19:13.429734" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.276270" elapsed="0.153642"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:13.435151" elapsed="0.000403"/>
</kw>
<kw name="Open 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-07T17:19:13.435716" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.436033" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.430882" elapsed="0.005305"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:13.430237" elapsed="0.005996"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.263016" elapsed="0.173269"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:19:13.251062" elapsed="0.185274"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.250680" elapsed="0.185711"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:13.250541" elapsed="0.185894"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.450843" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.450725" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.450701" elapsed="0.000232"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.451236" 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-07T17:19:13.451339" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.451102" elapsed="0.000262"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.451772" level="INFO">{1: 390}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.451511" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.452218" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.451961" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.453008" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:19:13.452765" elapsed="0.000357">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-07T17:19:13.453230" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:13.453274" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.452413" elapsed="0.000884"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:13.453586" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:13.453371" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.453352" elapsed="0.000330"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.454414" level="INFO">${ip_address} = 10.30.171.205</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.454152" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:13.454485" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:13.454633" level="INFO">${odl_ip} = 10.30.171.205</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.453873" elapsed="0.000784"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.454809" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.455541" level="INFO">index=392
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:19:13.455639" level="INFO">${karaf_connection_object} = index=392
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.455406" elapsed="0.000295"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.455846" elapsed="0.002032"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.458312" level="INFO">Logging into '10.30.171.205:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:19:13.634905" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.458051" elapsed="0.176950"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:13.637878" elapsed="0.000402"/>
</kw>
<kw name="Open 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-07T17:19:13.638438" elapsed="0.000148"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.638730" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.635820" elapsed="0.003057"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:13.635254" elapsed="0.003668"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.450432" elapsed="0.188563"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:19:13.437067" elapsed="0.201977"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.436679" elapsed="0.202415"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:13.436542" elapsed="0.202592"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.651502" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.651391" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.651371" elapsed="0.000201"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.651847" 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-07T17:19:13.651948" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.651718" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.652400" level="INFO">{1: 390, 2: 392}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.652143" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.652827" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:13.652588" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.653594" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:19:13.653385" elapsed="0.000298">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-07T17:19:13.653785" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:13.653829" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.653036" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:13.654164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:13.653926" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.653907" elapsed="0.000354"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.655042" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.654761" elapsed="0.000308"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:13.655117" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:13.655267" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.654492" elapsed="0.000799"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.655451" elapsed="0.000394"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.656165" level="INFO">index=394
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:19:13.656263" level="INFO">${karaf_connection_object} = index=394
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.656025" elapsed="0.000264"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.656431" elapsed="0.002176"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.659032" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:19:13.934937" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.658763" elapsed="0.276376"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:13.938675" elapsed="0.000442"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.939283" elapsed="0.000176"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.939607" elapsed="0.000103"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:13.936445" elapsed="0.003317"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:13.935622" elapsed="0.004190"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:19:13.651097" elapsed="0.288788"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:19:13.639732" elapsed="0.300215"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.639368" elapsed="0.300653"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:13.639221" elapsed="0.300842"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-07T17:19:13.250374" elapsed="0.689729"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-07T17:19:11.267230" elapsed="2.672937"/>
</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-07T17:19:13.942675" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.942555" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.942531" 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-07T17:19:13.947210" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.947104" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.947087" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.948250" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:13.947826" elapsed="0.000452"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:13.948815" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:13.948506" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:13.948887" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:19:13.949068" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:13.947499" elapsed="0.001593"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.954386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.954277" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.954259" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:13.955741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:13.955564" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:13.955546" elapsed="0.000333"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:13.956500" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:13.956076" elapsed="0.000464"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.957043" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:13.956775" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:13.987732" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:13.958691" elapsed="0.029422"/>
</kw>
<msg time="2026-04-07T17:19:13.988465" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:13.988628" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.957307" elapsed="0.031435"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.029760" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:13.992511" elapsed="0.037423"/>
</kw>
<msg time="2026-04-07T17:19:14.030116" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.030188" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.989378" elapsed="0.040862"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.030739" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.030411" elapsed="0.000478"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.030386" elapsed="0.000531"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.031625" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.031084" elapsed="0.000673"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.032229" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.031883" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.031863" elapsed="0.000535"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.032432" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.034300" elapsed="0.000310"/>
</kw>
<kw name="Open 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-07T17:19:14.034815" elapsed="0.000197"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.035204" elapsed="0.000103"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.033613" elapsed="0.001911"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.032709" elapsed="0.002909"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:13.955217" elapsed="0.080502"/>
</kw>
<msg time="2026-04-07T17:19:14.035811" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.035855" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.954602" elapsed="0.081291"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.036120" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.035986" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.035951" elapsed="0.000254"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.036633" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.037032" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.037106" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:13.953981" elapsed="0.083233"/>
</kw>
<msg time="2026-04-07T17:19:14.037307" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.037352" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:13.949463" elapsed="0.087925"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.037707" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.037463" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.037446" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:13.949325" elapsed="0.088482"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.042930" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.042821" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.042800" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.044423" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.044243" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.044225" elapsed="0.000334"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.045126" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.044699" elapsed="0.000467"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.045651" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:14.045394" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.079215" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:14.047230" elapsed="0.032126"/>
</kw>
<msg time="2026-04-07T17:19:14.079507" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:14.079578" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.045913" elapsed="0.033716"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.117346" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:14.081266" elapsed="0.036284"/>
</kw>
<msg time="2026-04-07T17:19:14.117720" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.117793" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.079879" elapsed="0.038010"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.118422" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.118090" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.118062" elapsed="0.000540"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.119312" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.118740" elapsed="0.000697"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.119868" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.119562" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.119542" elapsed="0.000513"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.120088" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.121916" elapsed="0.000329"/>
</kw>
<kw name="Open 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-07T17:19:14.122446" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.122778" elapsed="0.000099"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.121263" elapsed="0.001749"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.120364" elapsed="0.002742"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:14.043755" elapsed="0.079450"/>
</kw>
<msg time="2026-04-07T17:19:14.123296" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.123340" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.043171" elapsed="0.080206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.123558" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.123453" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.123435" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.124074" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.124482" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.124555" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:14.042525" elapsed="0.082136"/>
</kw>
<msg time="2026-04-07T17:19:14.124752" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.124796" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.038084" elapsed="0.086748"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.125166" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.124907" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.124890" elapsed="0.000353"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:14.037932" elapsed="0.087334"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.130352" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.130245" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.130227" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.131697" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.131521" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.131504" elapsed="0.000389"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.132527" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.132078" elapsed="0.000489"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.133065" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:14.132799" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.170402" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:14.134659" elapsed="0.035962"/>
</kw>
<msg time="2026-04-07T17:19:14.170839" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:14.170912" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.133329" elapsed="0.037657"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.212126" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:14.172816" elapsed="0.039841"/>
</kw>
<msg time="2026-04-07T17:19:14.213034" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.213134" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.171326" elapsed="0.041872"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.214181" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.213498" elapsed="0.000897"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.213440" elapsed="0.001003"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.215520" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "1 "0 "_ "_ "O "v "s "d "b "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.214619" elapsed="0.001035"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.216143" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.215793" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.215769" elapsed="0.000586"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.216398" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.218685" elapsed="0.000359"/>
</kw>
<kw name="Open 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-07T17:19:14.219258" elapsed="0.000184"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.219665" elapsed="0.000124"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.217945" elapsed="0.001993"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.216737" elapsed="0.003326"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:14.131181" elapsed="0.088989"/>
</kw>
<msg time="2026-04-07T17:19:14.220271" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.220318" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.130565" elapsed="0.089834"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.220602" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.220487" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.220466" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.221211" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.221848" elapsed="0.000035"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.221937" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:14.129938" elapsed="0.092163"/>
</kw>
<msg time="2026-04-07T17:19:14.222229" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.222283" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.125518" elapsed="0.096803"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.222673" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.222405" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.222385" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:14.125385" elapsed="0.097394"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:13.949150" elapsed="0.273675"/>
</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-07T17:19:13.946796" elapsed="0.276100"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-07T17:19:13.940764" elapsed="0.282194"/>
</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-07T17:19:13.940324" elapsed="0.282699"/>
</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-07T17:19:11.262156" elapsed="2.960925"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.224284" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-07T17:19:14.223821" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-07T17:19:14.224550" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.224425" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.224402" elapsed="0.000248"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.224838" elapsed="0.000029"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.225146" elapsed="0.000028"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.225375" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.225613" elapsed="0.000029"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.225962" elapsed="0.000050"/>
</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-07T17:19:14.223427" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:11.261702" elapsed="2.964462"/>
</kw>
<test id="s1-s2-s1-t1" name="Check Shards Status Before Fail" line="17">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:14.230764" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:14.230429" elapsed="0.000709"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.232394" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.232261" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.232242" 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-07T17:19:14.237430" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.237289" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.237264" elapsed="0.000256"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.238701" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.238285" elapsed="0.000444"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.239473" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:14.239047" elapsed="0.000462"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:14.239569" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:19:14.239780" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:14.237808" elapsed="0.002005"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.246176" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.246047" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.246021" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.247492" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.247382" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.247364" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.248132" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.247705" elapsed="0.000461"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.248721" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:14.248366" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.289488" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:14.249512" elapsed="0.040260"/>
</kw>
<msg time="2026-04-07T17:19:14.290058" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:14.290106" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.248987" elapsed="0.041157"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.345888" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:14.291086" elapsed="0.055088"/>
</kw>
<msg time="2026-04-07T17:19:14.346395" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.346445" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.290426" elapsed="0.056056"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.346924" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.346609" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.346569" elapsed="0.000485"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.347638" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.347202" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.348024" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.347784" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.347766" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.348207" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.350747" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:19:14.352231" elapsed="0.000535"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.353718" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.349220" elapsed="0.004920"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.348540" elapsed="0.005800"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:14.247077" elapsed="0.107368"/>
</kw>
<msg time="2026-04-07T17:19:14.354540" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.354585" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.246394" elapsed="0.108228"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.354809" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.354700" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.354681" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.355318" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.355659" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.355729" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:14.245627" elapsed="0.110212"/>
</kw>
<msg time="2026-04-07T17:19:14.355937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.355995" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.240414" elapsed="0.115619"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.356354" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.356109" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.356092" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:14.240197" elapsed="0.116256"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.361819" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.361712" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.361693" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.363086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.362963" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.362945" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.363656" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.363290" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.364107" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:14.363835" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.395050" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:14.364681" elapsed="0.030593"/>
</kw>
<msg time="2026-04-07T17:19:14.395487" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:14.395543" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.364283" elapsed="0.031307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.453333" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:14.396339" elapsed="0.057260"/>
</kw>
<msg time="2026-04-07T17:19:14.453814" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.453861" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.395819" elapsed="0.058084"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.454420" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.454119" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.454082" elapsed="0.000448"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.455115" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.454670" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.455477" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.455267" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.455249" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.455613" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.458442" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:19:14.459924" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.461373" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.456937" elapsed="0.004838"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.455942" elapsed="0.005949"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:14.362665" elapsed="0.099341"/>
</kw>
<msg time="2026-04-07T17:19:14.462098" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.462142" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.362046" elapsed="0.100133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.462363" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.462256" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.462237" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.462840" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.463212" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.463284" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:14.361350" elapsed="0.102040"/>
</kw>
<msg time="2026-04-07T17:19:14.463483" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.463526" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.356741" elapsed="0.106822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.463880" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.463637" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.463620" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:14.356603" elapsed="0.107392"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.469185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.469078" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.469059" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.470436" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.470328" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.470311" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.471126" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.470640" elapsed="0.000514"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.471603" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:14.471346" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.502131" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:14.472255" elapsed="0.030057"/>
</kw>
<msg time="2026-04-07T17:19:14.502486" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:14.502532" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.471825" elapsed="0.030743"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:14.561409" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:14.503210" elapsed="0.058439"/>
</kw>
<msg time="2026-04-07T17:19:14.561844" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:14.561889" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.502741" elapsed="0.059185"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.562323" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.562053" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.562022" elapsed="0.000409"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.563002" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "B "e "f "[78Co "[A[78Cr
 "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.562574" elapsed="0.000513"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.563367" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.563155" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.563137" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:14.563502" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.565943" elapsed="0.000564"/>
</kw>
<kw name="Open 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-07T17:19:14.567474" elapsed="0.000540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:14.569082" elapsed="0.000429"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.564429" elapsed="0.005181"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:14.563799" elapsed="0.005964"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:14.470028" elapsed="0.099870"/>
</kw>
<msg time="2026-04-07T17:19:14.570031" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.570080" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.469395" elapsed="0.100723"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:14.570310" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.570200" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.570180" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.570814" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.573234" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.573320" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:14.468710" elapsed="0.104779"/>
</kw>
<msg time="2026-04-07T17:19:14.573586" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:14.573631" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.464262" elapsed="0.109405"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.574018" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.573744" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.573726" elapsed="0.000374"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:14.464128" elapsed="0.109995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:14.239891" elapsed="0.334267"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:14.236810" elapsed="0.337405"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:14.231900" elapsed="0.342369"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:14.231336" elapsed="0.342978"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:14.227023" elapsed="0.347342"/>
</kw>
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:19:14.594342" elapsed="0.000239"/>
</kw>
<msg time="2026-04-07T17:19:14.594632" 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-07T17:19:14.593698" elapsed="0.000988"/>
</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 [['topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.593238" elapsed="0.001525"/>
</kw>
<msg time="2026-04-07T17:19:14.594808" 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-07T17:19:14.585203" elapsed="0.009650"/>
</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-07T17:19:14.584752" elapsed="0.010175"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.595389" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.595129" 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-07T17:19:14.600468" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.600072" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.600959" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:14.600651" elapsed="0.000388"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:14.601088" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:14.601249" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:14.599685" elapsed="0.001590"/>
</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-07T17:19:14.601427" elapsed="0.000157"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.602106" 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-07T17:19:14.601740" elapsed="0.000393"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.602528" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:14.602287" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.602937" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:14.602699" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.605713" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.605359" elapsed="0.000381"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:14.605785" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:14.605936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.604997" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.655140" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.654751" elapsed="0.000416"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.655980" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.655657" elapsed="0.000409">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.656162" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.655327" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.656725" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.656344" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.657061" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:14.657267" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:14.656907" elapsed="0.000385"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.657682" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.657442" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.658812" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.658556" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.659302" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.659031" elapsed="0.000297"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.659640" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.659839" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.660027" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:14.659509" elapsed="0.000576"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.659374" elapsed="0.000741"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:14.660156" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:14.660313" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:14.658096" elapsed="0.002242"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.657793" elapsed="0.002576"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.660535" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.660393" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.657774" elapsed="0.002835"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.661211" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.660746" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.661285" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:14.654146" elapsed="0.007261"/>
</kw>
<msg time="2026-04-07T17:19:14.661581" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.642143" elapsed="0.019549"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.673318" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.684934" elapsed="0.000080"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.696521" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.696919" elapsed="0.000075"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.697349" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.697854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.697712" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:14.697696" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.698085" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.698249" 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-07T17:19:14.698410" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:14.697666" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.697530" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.698800" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.698953" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:19:14.699160" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:14.636659" elapsed="0.062550"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.701523" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.701282" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.701777" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.700840" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.702329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.701965" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.703032" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.702713" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.702500" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.701924" elapsed="0.001248"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.705822" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.703481" elapsed="0.002390"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:14.706038" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:19:14.706327" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:14.700052" elapsed="0.006324"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.708621" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.708382" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.708880" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.707954" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:14.709312" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.709080" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.709039" elapsed="0.000431"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.709766" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.710259" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.710403" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:14.712264" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:14.707163" elapsed="0.005150"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.715782" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.715456" elapsed="0.000425"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.716539" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.716217" elapsed="0.000416"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:14.736619" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:14.737075" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:19:14 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:14.737315" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:14.718864" elapsed="0.018479"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.716770" elapsed="0.020641"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.737675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.737471" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.716728" elapsed="0.021089"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.742197" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.739458" elapsed="0.002953"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.739238" elapsed="0.003209"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.739217" elapsed="0.003256"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.744869" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.742750" elapsed="0.002164"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.742529" elapsed="0.002419"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.742512" elapsed="0.002475"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.745545" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.745146" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.745873" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.745642" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.746423" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.746124" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.745954" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.745624" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.747067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.746656" elapsed="0.000438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.747391" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.747163" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.747915" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.747624" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.747472" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.747145" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.748156" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:14.748933" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.748652" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.749122" elapsed="0.002150"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:14.738535" elapsed="0.012887"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.751752" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.751561" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.751520" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:14.757899" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:14.752195" elapsed="0.005753"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:14.758061" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:19:14.758352" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:14.713068" elapsed="0.045334"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.758623" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:14.758876" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:14.613731" elapsed="0.145172"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.759255" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.759001" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.758983" elapsed="0.000738"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.759755" elapsed="0.000026"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:14.609802" elapsed="0.150076"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.606058" elapsed="0.153863"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.606039" elapsed="0.153906"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.760598" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.760490" elapsed="0.000152"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:14.760763" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.760664" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.760473" elapsed="0.000370"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.761009" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:19:14.761130" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:14.760219" elapsed="0.000936"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.761694" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.761328" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.762344" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.761869" elapsed="0.000501"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.768603" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.768058" elapsed="0.000628"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.769430" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.768853" elapsed="0.000658"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:14.781765" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:14.781867" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:14 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:14 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":174,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:19:09.811","LastApplied":438,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":438,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.299","active":true,"matchIndex":438,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":439},{"timeSinceLastActivity":"00:00:00.300","active":true,"matchIndex":438,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":439}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"794.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":114,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":44,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582354,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:14.782038" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:14.774251" elapsed="0.007837"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.769595" elapsed="0.012644"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.782453" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.782268" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.769576" elapsed="0.013144"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.787055" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":174,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:19:09.811","LastApplied":438,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":438,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.299","active":true,"matchIndex":438,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":439},{"timeSinceLastActivity":"00:00:00.300","active":true,"matchIndex":438,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":439}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"794.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":114,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":44,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582354,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.784553" elapsed="0.003863"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.784075" elapsed="0.004475"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.784032" elapsed="0.004635"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.793430" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.789852" elapsed="0.003721"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.788937" elapsed="0.004736"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.788854" elapsed="0.004917"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.795334" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.794434" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.796120" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.795587" elapsed="0.000662"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.797194" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.796683" elapsed="0.000558"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.796317" elapsed="0.001002"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.795542" elapsed="0.001848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.798747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.797942" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.799514" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.799021" elapsed="0.000618"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.800557" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.800082" elapsed="0.000520"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.799709" elapsed="0.000961"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.798944" elapsed="0.001792"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.801077" elapsed="0.000668"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:14.802679" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.802034" elapsed="0.000746"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.803299" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:14.783186" elapsed="0.022712"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.806172" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.806017" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.805996" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:14.809807" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:14.806459" elapsed="0.003378"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:14.810019" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:14.810197" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:14.763310" elapsed="0.046914"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.810285" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:14.810436" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:14.762577" elapsed="0.047885"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.811620" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.811103" elapsed="0.000546"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:14.811697" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:14.811876" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:14.810718" elapsed="0.001184"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.812336" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 438, 'CommittedTransactionsCount': 114, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.812125" elapsed="0.000238"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:14.812713" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.812514" elapsed="0.000224"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:14.812783" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:14.812943" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:14.604314" elapsed="0.208669"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:14.813046" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:14.813203" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:19:14.603573" elapsed="0.209655"/>
</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-07T17:19:14.813544" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.813312" elapsed="0.000289"/>
</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="PASS" start="2026-04-07T17:19:14.813827" elapsed="0.000210"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.813625" elapsed="0.000451"/>
</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-07T17:19:14.814245" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.814101" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.813293" elapsed="0.001027"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:14.603231" elapsed="0.211114"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.817052" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.816644" elapsed="0.000437"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:14.817128" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:14.817276" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:14.816307" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.867062" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.866575" elapsed="0.000642"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.868044" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.867735" elapsed="0.000398">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.868228" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.867398" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.868802" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.868417" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.869156" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:14.869343" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:14.869006" elapsed="0.000363"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.869783" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.869536" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.871043" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.870769" elapsed="0.000318"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.871523" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.871246" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.871898" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.872119" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.872293" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:14.871763" elapsed="0.000587"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.871609" elapsed="0.000775"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:14.872435" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:19:14.872606" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:14.870249" elapsed="0.002381"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.869912" elapsed="0.002750"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.872830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.872688" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.869884" elapsed="0.003021"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.873541" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.873060" elapsed="0.000508"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.873616" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:14.865942" elapsed="0.007796"/>
</kw>
<msg time="2026-04-07T17:19:14.873791" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.853414" elapsed="0.020535"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.888834" elapsed="0.000097"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.901209" elapsed="0.000074"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.913348" elapsed="0.000106"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.914008" elapsed="0.000067"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.914455" elapsed="0.000059"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.915143" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.914957" elapsed="0.000253"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:14.914935" elapsed="0.000309"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.915397" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.915561" 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-07T17:19:14.915734" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:14.914878" elapsed="0.000918"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.914670" elapsed="0.001171"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.916204" elapsed="0.000063"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.916378" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:19:14.916658" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:14.847798" elapsed="0.068925"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.919679" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.919311" elapsed="0.000470">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.920014" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.918710" elapsed="0.001353"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.920597" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.920215" elapsed="0.000474"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.921389" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.921068" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.920749" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.920167" elapsed="0.001407"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.924505" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:14.921896" elapsed="0.002662"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:14.924657" elapsed="0.000071"/>
</return>
<msg time="2026-04-07T17:19:14.924963" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:14.917735" elapsed="0.007369"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:14.927628" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:14.927364" elapsed="0.000330">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:14.927901" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:14.926908" elapsed="0.001044"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:14.928357" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.928126" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.928081" elapsed="0.000457"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.928881" elapsed="0.000063"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.929375" elapsed="0.000058"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.929559" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:19:14.931529" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:14.926050" elapsed="0.005529"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.935625" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.935256" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.936454" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.936096" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:14.960748" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:14.961765" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:19:14 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:14.962292" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:14.938795" elapsed="0.023558"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.936693" elapsed="0.025812"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.963175" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.962658" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.936649" elapsed="0.026874"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.971490" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.967114" elapsed="0.004618"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.966559" elapsed="0.005211"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.966503" elapsed="0.005293"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.974403" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.972125" elapsed="0.002332"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.971852" elapsed="0.002645"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.971835" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.975138" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.974688" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.975489" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.975236" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.976082" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.975738" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.975574" elapsed="0.000570"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.975217" elapsed="0.000949"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.976707" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.976333" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.977190" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.976812" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.977786" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.977433" elapsed="0.000380"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.977279" elapsed="0.000571"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.976792" elapsed="0.001083"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:14.978040" elapsed="0.000362"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:14.978891" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.978565" elapsed="0.000352"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:14.979089" elapsed="0.002188"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:14.965192" elapsed="0.016248"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.981815" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.981604" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.981545" elapsed="0.000399"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:14.988195" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:14.982289" elapsed="0.005957"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:14.988344" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:19:14.988654" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:14.932385" elapsed="0.056321"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.988928" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:14.989241" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:14.825133" elapsed="0.164139"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.989709" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:14.989366" elapsed="0.000878"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.989347" elapsed="0.000929"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:14.990311" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:14.821098" elapsed="0.169343"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:14.817396" elapsed="0.173090"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.817377" elapsed="0.173133"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:14.991205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:14.991090" elapsed="0.000159"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:14.991371" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:14.991271" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:14.991071" elapsed="0.000379"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:14.991596" elapsed="0.000026"/>
</kw>
<msg time="2026-04-07T17:19:14.991723" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:14.990793" elapsed="0.000955"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.992318" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:14.991917" elapsed="0.000428"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.992999" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:14.992502" elapsed="0.000532"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:14.999375" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.998752" elapsed="0.000711"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.000243" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:14.999631" elapsed="0.000694"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.013529" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.013698" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:15 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":438,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":438,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"331.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582355,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:15.013918" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.005201" elapsed="0.008819"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.000412" elapsed="0.013851"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.014573" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.014311" elapsed="0.000583"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.000391" elapsed="0.014542"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.021281" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":438,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":438,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"331.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.017806" elapsed="0.003648"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.016959" elapsed="0.004606"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.016898" elapsed="0.004790"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.026155" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.022684" elapsed="0.003572"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.021928" elapsed="0.004401"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.021868" elapsed="0.004531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.027808" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.026955" elapsed="0.000963"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.028603" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.028086" elapsed="0.000643"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.029704" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.029185" elapsed="0.000567"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.028799" elapsed="0.001021"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.028044" elapsed="0.001841"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.031347" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.030458" elapsed="0.000989"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.032132" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.031590" elapsed="0.000669"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.033188" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.032687" elapsed="0.000552"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.032327" elapsed="0.000985"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.031546" elapsed="0.001833"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.033738" elapsed="0.000765"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.035526" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.034782" elapsed="0.000843"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.035900" elapsed="0.002519"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.015613" elapsed="0.022924"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.038792" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.038635" elapsed="0.000276"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.038615" elapsed="0.000323"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.042542" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.039301" elapsed="0.003270"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.042681" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:19:15.042854" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:14.994046" elapsed="0.048882"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.043202" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:15.043362" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:14.993256" elapsed="0.050132"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.044695" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.044016" elapsed="0.000714"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:15.044781" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:15.045010" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:15.043629" elapsed="0.001411"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.045451" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 438, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.045229" elapsed="0.000251"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.045887" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.045645" elapsed="0.000274"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:15.046005" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:15.046182" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:14.815685" elapsed="0.230523"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:15.046276" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.046443" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:14.814706" elapsed="0.231764"/>
</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="PASS" start="2026-04-07T17:19:15.046769" elapsed="0.000240"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.046553" elapsed="0.000495"/>
</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-07T17:19:15.047230" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.047074" 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-07T17:19:15.047457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.047311" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.046535" elapsed="0.000997"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:14.814534" elapsed="0.233023"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.050389" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.050021" elapsed="0.000395"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:15.050467" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:19:15.050620" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:15.049584" elapsed="0.001060"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.100656" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.100284" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.101446" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.101214" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.101655" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.100854" elapsed="0.000830"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.102302" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.101876" elapsed="0.000455"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.102643" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:15.102806" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:15.102500" elapsed="0.000331"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.103255" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.103009" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.106022" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.105692" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.106498" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.106226" elapsed="0.000298"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.106863" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.107098" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.107267" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.106720" elapsed="0.000616"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.106577" elapsed="0.000791"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:15.107413" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:15.107579" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:15.103685" elapsed="0.003922"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.103383" elapsed="0.004256"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.107815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.107664" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.103362" elapsed="0.004529"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.108521" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.108043" elapsed="0.000507"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.108598" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.099622" elapsed="0.009100"/>
</kw>
<msg time="2026-04-07T17:19:15.108775" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.087544" elapsed="0.021337"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.121305" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.133495" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.145744" elapsed="0.000065"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.146207" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.146591" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.147131" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.146954" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:15.146939" elapsed="0.000279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.147356" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.147538" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.147702" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.146909" elapsed="0.000846"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.146774" elapsed="0.001018"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.148134" elapsed="0.000057"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.148303" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:19:15.148508" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:15.081728" elapsed="0.066831"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.151260" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.151003" elapsed="0.000327">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.151529" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.150531" elapsed="0.001043"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.152088" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.151729" elapsed="0.000442"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.152764" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.152449" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.152230" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.151685" elapsed="0.001231"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.155644" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.153249" elapsed="0.002446"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:15.155801" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:19:15.156229" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.149433" elapsed="0.006850"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.158699" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.158446" elapsed="0.000324">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.159027" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.158009" elapsed="0.001066"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:15.159473" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.159239" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.159192" elapsed="0.000450"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.159953" elapsed="0.000110"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.160413" elapsed="0.000058"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.160565" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:19:15.219274" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.157119" elapsed="0.062228"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.223368" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.222889" elapsed="0.000584"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.224159" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.223808" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.245268" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.246526" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:19:15 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:15.247150" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.226564" elapsed="0.020658"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.224413" elapsed="0.022990"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.248138" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.247556" elapsed="0.000807"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.224360" elapsed="0.024140"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.256594" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.252346" elapsed="0.004464"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.251770" elapsed="0.005076"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.251719" elapsed="0.005153"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.259336" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.257190" elapsed="0.002192"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.256929" elapsed="0.002488"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.256911" elapsed="0.002531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.260056" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.259618" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.260391" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.260154" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.260942" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.260633" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.260474" elapsed="0.000563"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.260135" elapsed="0.000925"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.261582" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.261215" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.262022" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.261679" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.262565" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.262269" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.262113" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.261660" elapsed="0.000987"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.262798" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.263649" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.263331" elapsed="0.000344"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.263824" elapsed="0.002260"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.250394" elapsed="0.015846"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.266579" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.266382" elapsed="0.000269"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.266340" elapsed="0.000366"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.272815" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.267027" elapsed="0.005837"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.272975" elapsed="0.000077"/>
</return>
<msg time="2026-04-07T17:19:15.273286" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.220289" elapsed="0.053047"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.273557" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.273819" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.058719" elapsed="0.215127"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.274220" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.273931" elapsed="0.000755"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.273914" elapsed="0.000832"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.274786" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:15.054588" elapsed="0.220334"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.050712" elapsed="0.224268"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.050694" elapsed="0.224312"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.275651" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.275544" elapsed="0.000152"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:15.275818" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.275718" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.275526" elapsed="0.000376"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.276069" elapsed="0.000024"/>
</kw>
<msg time="2026-04-07T17:19:15.276191" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:15.275274" elapsed="0.000942"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.276752" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.276379" elapsed="0.000399"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.277417" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.276933" elapsed="0.000512"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.283368" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.282789" elapsed="0.000663"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.284251" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.283619" elapsed="0.000712"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.297017" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.297164" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:15 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Follower","LastApplied":438,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":438,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"305.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582355,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:15.297377" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.289081" elapsed="0.008366"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.284416" elapsed="0.013242"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.297955" elapsed="0.000107"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.297700" elapsed="0.000608"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.284396" elapsed="0.013948"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.304509" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":437,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":437,"Leader":"member-1-shard-topology-operational","LastIndex":438,"RaftState":"Follower","LastApplied":438,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":438,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"305.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":438,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":119691},"timestamp":1775582355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.301118" elapsed="0.003546"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.300384" elapsed="0.004375"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.300320" elapsed="0.004536"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.308391" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.305756" elapsed="0.002732"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.305084" elapsed="0.003477"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.305026" elapsed="0.003604"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.310011" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.309201" elapsed="0.000921"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.310765" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.310264" elapsed="0.000628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.311813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.311332" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.310959" elapsed="0.000977"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.310221" elapsed="0.001848"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.313555" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.312618" elapsed="0.001048"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.314360" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.313810" elapsed="0.000676"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.315407" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.314911" elapsed="0.000542"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.314556" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.313767" elapsed="0.001822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.315896" elapsed="0.000673"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.317470" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.316843" elapsed="0.000725"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.317836" elapsed="0.002563"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.298987" elapsed="0.021521"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.320750" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.320605" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.320586" elapsed="0.000302"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.324244" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.321051" elapsed="0.003222"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.324373" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:19:15.324533" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.278418" elapsed="0.046172"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.324650" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:15.324831" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.277654" elapsed="0.047207"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.325981" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.325435" elapsed="0.000576"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:15.326061" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:19:15.326263" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755823...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:15.325101" elapsed="0.001189"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.326645" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 438, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.326444" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.327040" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.326822" elapsed="0.000243"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:15.327111" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:15.327260" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:15.048922" elapsed="0.278363"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:15.327343" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:15.327490" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:15.047923" elapsed="0.279591"/>
</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="PASS" start="2026-04-07T17:19:15.327807" elapsed="0.000253"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.327595" elapsed="0.000503"/>
</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-07T17:19:15.328264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.328123" 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-07T17:19:15.328476" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.328341" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.327577" elapsed="0.000971"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:15.047751" elapsed="0.280821"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:14.603029" elapsed="0.725579"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.328653" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:15.328855" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:19:15.328901" level="INFO">${follower_list} = [2, 3]</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-07T17:19:14.598958" elapsed="0.729966"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.329379" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:19:15.329454" level="INFO">${leader_count} = 1</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-07T17:19:15.329110" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.329755" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.329547" elapsed="0.000261"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.329528" elapsed="0.000303"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.331948" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:19:15.329960" elapsed="0.002113"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:15.332461" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.332273" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.332533" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:19:14.596454" elapsed="0.736233"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:19:14.596232" elapsed="0.736503"/>
</iter>
<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-07T17:19:15.337053" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.336643" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.337544" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.337233" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:15.337615" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.337766" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.336268" 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-07T17:19:15.337951" elapsed="0.000196"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.338646" 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-07T17:19:15.338304" elapsed="0.000377"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.339097" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.338844" elapsed="0.000278"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.339517" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.339265" elapsed="0.000277"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.342051" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.341672" elapsed="0.000407"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:15.342134" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.342293" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:15.341325" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.391632" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.391264" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.392425" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.392164" elapsed="0.000343">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.392598" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.391820" elapsed="0.000802"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.393178" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.392781" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.393499" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:15.393653" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:15.393362" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.394131" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.393865" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.395164" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.394892" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.395635" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.395365" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.395993" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.396195" elapsed="0.000023"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.396363" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.395839" elapsed="0.000581"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.395707" elapsed="0.000743"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:15.396491" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.396659" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:15.394566" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.394277" elapsed="0.002439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.396882" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.396741" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.394258" elapsed="0.002699"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.397556" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.397117" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.397630" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.390647" elapsed="0.007116"/>
</kw>
<msg time="2026-04-07T17:19:15.397816" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.378904" elapsed="0.019019"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.410006" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.421766" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.433679" elapsed="0.000072"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.434123" elapsed="0.000057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.434537" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.435066" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.434909" elapsed="0.000249"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:15.434895" elapsed="0.000287"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.435330" 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-07T17:19:15.435494" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.435665" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.434865" elapsed="0.000854"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.434720" elapsed="0.001037"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.436077" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.436246" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.436437" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:15.373302" elapsed="0.063184"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.438887" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.438643" elapsed="0.000307">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.439188" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.438199" elapsed="0.001034"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.439713" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.439372" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.440387" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.440077" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.439849" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.439331" elapsed="0.001198"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.443131" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.440842" elapsed="0.002336"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:15.443274" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:15.443557" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.437350" elapsed="0.006257"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.445977" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.445725" elapsed="0.000316">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.446232" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.445318" elapsed="0.000997"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:15.446673" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.446455" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.446414" elapsed="0.000416"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.447141" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.447512" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.447656" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.449678" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.444511" elapsed="0.005217"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.453299" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.452953" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.454060" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.453720" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.463945" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.464590" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:15.464788" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.456463" elapsed="0.008351"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.454302" elapsed="0.010591"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.465172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.464954" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.454248" elapsed="0.011065"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.469440" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.466874" elapsed="0.002782"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.466657" elapsed="0.003035"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.466637" elapsed="0.003079"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.472302" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.470021" elapsed="0.002326"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.469771" elapsed="0.002611"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.469754" elapsed="0.002652"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.472934" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.472560" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.473363" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.473095" elapsed="0.000328"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.473897" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.473599" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.473446" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.473076" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.474534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.474148" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.474855" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.474629" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.475424" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.475129" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.474937" elapsed="0.000548"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.474611" elapsed="0.000895"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.475647" elapsed="0.000363"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.476445" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.476170" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.476615" elapsed="0.002231"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.466048" elapsed="0.012976"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.479358" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.479166" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.479125" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.485576" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.479776" elapsed="0.005848"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.485721" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:15.486035" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.450533" elapsed="0.035555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.486318" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.486575" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.350322" elapsed="0.136280"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.486946" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.486684" elapsed="0.000724"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.486667" elapsed="0.000770"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.487471" elapsed="0.000026"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:15.346325" elapsed="0.141270"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.342386" elapsed="0.145252"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.342369" elapsed="0.145293"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.488402" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.488295" elapsed="0.000151"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:15.488567" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.488468" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.488277" elapsed="0.000369"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.488796" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:19:15.488913" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:15.488016" elapsed="0.000922"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.489479" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.489114" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.490136" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.489655" elapsed="0.000508"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.496283" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.495637" elapsed="0.000729"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.497099" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.496530" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.508681" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.508783" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:15 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":26,"SnapshotIndex":117,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-operational","LastIndex":120,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":118,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":120,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.500","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-operational","nextIndex":119},{"timeSinceLastActivity":"00:00:00.500","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-operational","nextIndex":119}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"672.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":34,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52598},"timestamp":1775582355,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:15.508934" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.501906" elapsed="0.007093"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.497264" elapsed="0.011885"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.509354" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.509178" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.497245" elapsed="0.012368"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.515039" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":26,"SnapshotIndex":117,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":117,"Leader":"member-1-shard-default-operational","LastIndex":120,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":118,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":120,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.500","active":true,"matchIndex":118,"voting":true,"id":"member-3-shard-default-operational","nextIndex":119},{"timeSinceLastActivity":"00:00:00.500","active":true,"matchIndex":118,"voting":true,"id":"member-2-shard-default-operational","nextIndex":119}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"672.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":118,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":34,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52598},"timestamp":1775582355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.511749" elapsed="0.003442"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.511128" elapsed="0.004154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.511074" elapsed="0.004298"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.518736" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.516227" elapsed="0.002605"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.515569" elapsed="0.003330"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.515512" elapsed="0.003478"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.520493" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.519591" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.521242" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.520732" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.522272" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.521783" elapsed="0.000534"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.521435" elapsed="0.000994"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.520689" elapsed="0.001807"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.523866" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.523079" elapsed="0.000943"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.524820" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.524304" elapsed="0.000640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.525926" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.525439" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.525074" elapsed="0.000994"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.524134" elapsed="0.001998"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.526477" elapsed="0.000653"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.528070" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.527401" elapsed="0.000768"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.528443" elapsed="0.002642"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.510085" elapsed="0.021111"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.531453" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.531306" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.531286" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.535119" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.531733" elapsed="0.003415"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.535281" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:19:15.535443" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.491156" elapsed="0.044313"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.535536" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:15.535683" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.490394" elapsed="0.045314"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.536947" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.536431" elapsed="0.000560"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:15.537041" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:19:15.537231" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:15.535930" elapsed="0.001327"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.537621" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 118, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.537407" elapsed="0.000242"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.538012" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.537798" elapsed="0.000240"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:15.538085" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.538246" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:15.340703" elapsed="0.197567"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:15.538327" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:15.538514" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:19:15.339988" elapsed="0.198551"/>
</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-07T17:19:15.538851" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.538621" 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="PASS" start="2026-04-07T17:19:15.539160" elapsed="0.000198"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.538936" elapsed="0.000460"/>
</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-07T17:19:15.539561" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.539420" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.538603" elapsed="0.001032"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:15.339797" elapsed="0.199862"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.542099" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.541692" elapsed="0.000435"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:15.542172" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.542490" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:15.541359" elapsed="0.001156"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.591805" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.591423" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.592644" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.592397" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.592818" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.592057" elapsed="0.000785"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.593414" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.593022" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.593742" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:15.593890" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:15.593607" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.594323" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.594080" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.595328" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.595074" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.595789" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.595526" elapsed="0.000320"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.596187" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.596384" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.596551" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.596057" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.595904" elapsed="0.000731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:15.596677" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:15.596831" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:15.594744" elapsed="0.002111"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.594435" elapsed="0.002452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.597067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.596911" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.594415" elapsed="0.002729"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.597706" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.597281" elapsed="0.000452"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.597779" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.590795" elapsed="0.007104"/>
</kw>
<msg time="2026-04-07T17:19:15.597952" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.578865" elapsed="0.019209"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.609834" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.623090" elapsed="0.000073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.636376" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.636777" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.637184" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.637688" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.637547" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:15.637532" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.637904" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.638084" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.638247" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.637502" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.637368" elapsed="0.000968"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.638667" elapsed="0.000056"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.638824" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:15.639033" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:15.573203" elapsed="0.065881"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.641457" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.641210" elapsed="0.000312">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.641728" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.640752" elapsed="0.001021"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.642310" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.641916" elapsed="0.000475"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.643013" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.642685" elapsed="0.000356"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.642450" elapsed="0.000650"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.641871" elapsed="0.001285"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.645714" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.643459" elapsed="0.002300"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:15.645853" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:19:15.646212" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.639918" elapsed="0.006343"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.648673" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.648418" elapsed="0.000317">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.648943" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.647990" elapsed="0.001014"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:15.649382" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.649146" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.649104" elapsed="0.000438"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.649855" elapsed="0.000235"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.650439" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.650595" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:15.652643" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.647145" elapsed="0.005549"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.656279" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.655931" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.657039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.656700" elapsed="0.000435"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.676656" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.677099" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:15.677384" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.659366" elapsed="0.018046"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.657274" elapsed="0.020208"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.677743" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.677541" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.657233" elapsed="0.020653"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.681940" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.679425" elapsed="0.002731"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.679207" elapsed="0.002985"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.679187" elapsed="0.003030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.684650" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.682490" elapsed="0.002205"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.682272" elapsed="0.002458"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.682255" elapsed="0.002508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.685327" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.684929" elapsed="0.000424"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.685652" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.685423" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.686211" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.685897" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.685746" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.685405" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.686847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.686446" elapsed="0.000428"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.687225" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.686948" elapsed="0.000347"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.687761" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.687471" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.687319" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.686929" elapsed="0.000914"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.688010" elapsed="0.000391"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.688835" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.688560" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.689041" elapsed="0.002166"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.678638" elapsed="0.012719"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.691699" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.691496" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.691455" elapsed="0.000366"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.699229" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.692151" elapsed="0.007127"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.699376" elapsed="0.000076"/>
</return>
<msg time="2026-04-07T17:19:15.699678" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.653476" elapsed="0.046252"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.699974" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:15.700232" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.550279" elapsed="0.149980"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.700609" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.700355" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.700337" elapsed="0.000774"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.701145" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:15.546307" elapsed="0.154961"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.542585" elapsed="0.158724"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.542567" elapsed="0.158766"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.701955" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.701849" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:15.702140" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.702038" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.701832" elapsed="0.000387"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.702356" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:19:15.702473" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:15.701586" elapsed="0.000911"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.703064" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.702680" elapsed="0.000410"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.703698" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.703240" elapsed="0.000485"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.709658" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.709121" elapsed="0.000619"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.710452" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.709906" elapsed="0.000627"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.722693" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.722797" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:15 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":121,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":121,"Leader":"member-1-shard-default-operational","LastIndex":122,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":122,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":122,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"305.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":122,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52680},"timestamp":1775582355,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:15.722980" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.715240" elapsed="0.007793"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.710615" elapsed="0.012602"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.723442" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.723251" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.710596" elapsed="0.013081"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.728144" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":121,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":121,"Leader":"member-1-shard-default-operational","LastIndex":122,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":122,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":122,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"305.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":122,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52680},"timestamp":1775582355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.725660" elapsed="0.002608"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.725105" elapsed="0.003233"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.725062" elapsed="0.003345"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.731309" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.729077" elapsed="0.002328"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.728551" elapsed="0.002923"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.728510" elapsed="0.003032"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.732911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.732135" elapsed="0.000952"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.733713" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.733226" elapsed="0.000611"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.734769" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.734268" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.733903" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.733184" elapsed="0.001768"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.736290" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.735502" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.737254" elapsed="0.000059"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.736525" elapsed="0.000860"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.738306" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.737804" elapsed="0.000548"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.737453" elapsed="0.000969"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.736483" elapsed="0.002005"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.738810" elapsed="0.000648"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.740343" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.739728" elapsed="0.000713"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.740702" elapsed="0.002649"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.724155" elapsed="0.019304"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.743700" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.743555" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.743536" elapsed="0.000302"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.747147" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.744000" elapsed="0.003177"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.747279" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:15.747438" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.704705" elapsed="0.042758"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.747552" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:15.747701" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.703934" elapsed="0.043793"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.748778" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.748291" elapsed="0.000516"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:15.748854" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.749061" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:15.747941" elapsed="0.001147"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.749451" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 122, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.749238" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.749837" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.749628" elapsed="0.000234"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:15.749908" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:15.750071" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:15.540750" elapsed="0.209346"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:15.750151" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:15.750308" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:15.540041" elapsed="0.210290"/>
</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="PASS" start="2026-04-07T17:19:15.750617" elapsed="0.000229"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.750408" elapsed="0.000477"/>
</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-07T17:19:15.751069" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.750909" 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-07T17:19:15.751298" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.751160" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.750391" elapsed="0.000980"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:15.539821" elapsed="0.211572"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.753832" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.753493" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:15.753903" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:19:15.754080" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:15.753157" elapsed="0.000948"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.808566" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.808193" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.809314" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.809089" elapsed="0.000289">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.809516" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.808750" elapsed="0.000791"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.810097" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.809699" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.810417" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:15.810562" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:15.810280" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.811023" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.810739" elapsed="0.000329"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.812005" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.811737" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.812507" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.812238" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.812842" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.813060" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.813228" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.812716" elapsed="0.000569"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.812582" elapsed="0.000731"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:15.813355" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.813510" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:15.811422" elapsed="0.002112"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.811135" elapsed="0.002431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.813729" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.813590" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.811116" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.814378" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.813939" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.814453" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.807573" elapsed="0.007001"/>
</kw>
<msg time="2026-04-07T17:19:15.814627" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.795834" elapsed="0.018900"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.826588" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.838379" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.850286" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.850685" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.851119" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.851621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.851482" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:15.851466" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.851833" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.852012" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.852174" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:15.851436" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.851303" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.852561" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.852715" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.852906" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:15.790270" elapsed="0.062686"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.855312" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.855070" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.855566" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.854614" elapsed="0.000996"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.856129" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.855751" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.856771" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.856474" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.856268" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.855709" elapsed="0.001202"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.859436" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.857227" elapsed="0.002254"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:15.859576" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:19:15.859858" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.853798" elapsed="0.006109"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:15.862225" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:15.861983" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:15.862515" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:15.861560" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:15.862942" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.862702" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.862660" elapsed="0.000458"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.863417" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.863794" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.863940" elapsed="0.000136"/>
</return>
<msg time="2026-04-07T17:19:15.866065" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:15.860747" elapsed="0.005368"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.869697" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.869372" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.870458" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.870134" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.886592" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.887514" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:15.888605" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.873124" elapsed="0.015541"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.870687" elapsed="0.018130"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.889435" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.888950" elapsed="0.000678"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.870646" elapsed="0.019102"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.896236" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.892704" elapsed="0.003834"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.892398" elapsed="0.004190"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.892369" elapsed="0.004254"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.900004" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.897033" elapsed="0.003017"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.896702" elapsed="0.003383"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.896678" elapsed="0.003431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.900640" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.900270" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.900978" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.900736" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.901512" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.901215" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.901062" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.900718" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.902285" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.901890" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.902608" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.902381" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.903165" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.902842" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.902692" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.902363" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.903390" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.904192" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.903902" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.904366" elapsed="0.002100"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.891412" elapsed="0.015204"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.906996" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.906755" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.906714" elapsed="0.000410"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.913148" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.907419" elapsed="0.005778"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.913293" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:15.913582" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.866920" elapsed="0.046713"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.913854" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:15.914124" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.762506" elapsed="0.151644"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.914484" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.914234" elapsed="0.000717"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.914217" elapsed="0.000779"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.915031" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:15.758454" elapsed="0.156703"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.754171" elapsed="0.161028"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.754154" elapsed="0.161069"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.915848" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.915743" elapsed="0.000149"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:19:15.916049" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:15.915914" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.915725" elapsed="0.000404"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.916270" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:19:15.916388" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:15.915478" elapsed="0.000935"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.916935" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.916572" elapsed="0.000405"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.917585" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.917130" elapsed="0.000482"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.923479" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.922903" elapsed="0.000658"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.924351" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.923726" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:15.935603" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:15.935707" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:15 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:15 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":121,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":121,"Leader":"member-1-shard-default-operational","LastIndex":122,"RaftState":"Follower","LastApplied":122,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":122,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"259.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":122,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52680},"timestamp":1775582355,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:15.935856" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:15.929164" elapsed="0.006741"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.924514" elapsed="0.011572"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.936290" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.936115" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.924494" elapsed="0.012025"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.941426" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":121,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":121,"Leader":"member-1-shard-default-operational","LastIndex":122,"RaftState":"Follower","LastApplied":122,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":122,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"259.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":122,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":52680},"timestamp":1775582355,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.938553" elapsed="0.003026"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.938049" elapsed="0.003625"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.938007" elapsed="0.003761"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.945743" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:15.942652" elapsed="0.003225"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.941984" elapsed="0.004015"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.941910" elapsed="0.004188"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.948004" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.946855" elapsed="0.001248"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.948739" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.948243" elapsed="0.000621"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.949953" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.949477" elapsed="0.000540"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.948931" elapsed="0.001157"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.948201" elapsed="0.001952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.951508" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.950694" elapsed="0.000913"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.952261" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.951747" elapsed="0.000640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.953345" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.952807" elapsed="0.000583"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.952454" elapsed="0.001005"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.951705" elapsed="0.001819"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:15.953825" elapsed="0.000640"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:15.955377" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.954735" elapsed="0.000742"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.955740" elapsed="0.002485"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:15.936961" elapsed="0.021372"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:15.958574" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:15.958429" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.958410" elapsed="0.000301"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:15.962024" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:15.958851" elapsed="0.003202"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:15.962152" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:15.962308" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:15.918554" elapsed="0.043780"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:15.962431" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.962582" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.917817" elapsed="0.044791"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.963687" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:15.963205" elapsed="0.000511"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:15.963764" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.963935" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558235...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:15.962823" elapsed="0.001153"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.964326" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 122, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.964129" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:15.964696" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.964500" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:15.964767" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.964916" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:15.752522" elapsed="0.212419"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:15.965128" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:15.965276" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:15.751720" elapsed="0.213579"/>
</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="PASS" start="2026-04-07T17:19:15.965585" elapsed="0.000189"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.965376" elapsed="0.000435"/>
</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-07T17:19:15.965989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.965836" 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-07T17:19:15.966205" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.966069" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.965359" elapsed="0.000918"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:15.751546" elapsed="0.214754"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.339593" elapsed="0.626737"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.966369" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:15.966565" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:19:15.966611" level="INFO">${follower_list} = [2, 3]</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-07T17:19:15.335519" elapsed="0.631114"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.967092" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:19:15.967167" level="INFO">${leader_count} = 1</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-07T17:19:15.966800" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:15.967466" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:15.967258" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.967240" elapsed="0.000301"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.969593" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:19:15.967669" elapsed="0.001969"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:15.970038" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:15.969834" elapsed="0.000230"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.970111" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:19:15.333066" elapsed="0.637198"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:19:15.332827" elapsed="0.637482"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:19:14.596090" elapsed="1.374250"/>
</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="PASS" start="2026-04-07T17:19:14.595666" elapsed="1.374729"/>
</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-07T17:19:15.975407" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:15.975022" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.975887" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.975588" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:15.975957" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:19:15.976127" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:15.974629" 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-07T17:19:15.976301" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.976939" 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-07T17:19:15.976607" elapsed="0.000372"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.977372" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.977135" elapsed="0.000262"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.977940" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:15.977698" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:15.980416" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:15.980080" elapsed="0.000362"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:15.980487" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:15.980631" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:15.979732" elapsed="0.000923"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.030885" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.030517" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.031681" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.031437" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.031844" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.031108" elapsed="0.000760"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.032418" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.032040" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.032734" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:16.032953" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:16.032600" elapsed="0.000393"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.033389" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.033147" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.034369" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.034117" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.034831" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.034569" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.035217" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.035418" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.035585" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.035081" elapsed="0.000561"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.034904" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:16.035714" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.035871" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:16.033785" elapsed="0.002110"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.033500" elapsed="0.002426"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.036109" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.035951" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.033481" elapsed="0.002704"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.036741" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.036321" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.036815" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.029897" elapsed="0.007038"/>
</kw>
<msg time="2026-04-07T17:19:16.037004" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.018090" elapsed="0.019020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.048877" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.060757" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.072375" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.072806" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.073213" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.073715" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.073574" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:16.073559" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.073929" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.074255" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.074415" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.073530" elapsed="0.000938"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.073396" elapsed="0.001109"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.074806" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.074960" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:16.075197" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:16.012628" elapsed="0.062624"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.077567" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.077327" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.077853" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.076898" elapsed="0.001000"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.078417" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.078088" elapsed="0.000408"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.079076" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.078759" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.078552" elapsed="0.000624"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.078046" elapsed="0.001185"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.081710" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.079530" elapsed="0.002226"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:16.081850" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:19:16.082196" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.076095" elapsed="0.006150"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.084811" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.084571" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.085087" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.084159" elapsed="0.000973"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:16.085490" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.085271" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.085229" elapsed="0.000420"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.085949" elapsed="0.000071"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.086381" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.086529" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.088575" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.083246" elapsed="0.005379"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.092202" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.091787" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.092931" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.092613" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.103100" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.103680" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:16.103988" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.095359" elapsed="0.008668"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.093174" elapsed="0.010948"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.104482" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.104204" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.093134" elapsed="0.011547"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.110236" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.106712" elapsed="0.003810"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.106409" elapsed="0.004163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.106380" elapsed="0.004227"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.114025" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.111013" elapsed="0.003076"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.110684" elapsed="0.003452"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.110661" elapsed="0.003508"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.114895" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.114385" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.115414" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.115056" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.116191" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.115828" elapsed="0.000389"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.115528" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.115030" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.116782" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.116425" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.117123" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.116876" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.117642" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.117355" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.117204" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.116859" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.117864" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.118653" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.118376" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.118825" elapsed="0.002169"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.105639" elapsed="0.015506"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.121472" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.121283" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.121242" elapsed="0.000353"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.127852" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.121891" elapsed="0.006015"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.128026" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:19:16.128327" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.089423" elapsed="0.038954"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.128593" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.128845" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:15.989396" elapsed="0.139476"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.129236" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.128975" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.128944" elapsed="0.000762"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.129740" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:15.984588" elapsed="0.145277"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:15.980722" elapsed="0.149185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:15.980704" elapsed="0.149226"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:16.130581" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.130476" elapsed="0.000163"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.130697" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.130662" elapsed="0.000074"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.130459" elapsed="0.000299"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.130902" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:19:16.131037" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:16.130201" elapsed="0.000861"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.131633" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.131246" elapsed="0.000414"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.132293" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.131808" elapsed="0.000513"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.138221" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.137672" elapsed="0.000630"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.139003" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.138466" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.150115" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.150257" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:16 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":77,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":77,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.108","active":true,"matchIndex":77,"voting":true,"id":"member-2-shard-topology-config","nextIndex":78},{"timeSinceLastActivity":"00:00:00.109","active":true,"matchIndex":77,"voting":true,"id":"member-3-shard-topology-config","nextIndex":78}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"585.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":24,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:16.150465" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.143720" elapsed="0.006813"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.139166" elapsed="0.011577"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.151048" elapsed="0.000066"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.150784" elapsed="0.000578"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.139147" elapsed="0.012251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.158831" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":15,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":77,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":77,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.108","active":true,"matchIndex":77,"voting":true,"id":"member-2-shard-topology-config","nextIndex":78},{"timeSinceLastActivity":"00:00:00.109","active":true,"matchIndex":77,"voting":true,"id":"member-3-shard-topology-config","nextIndex":78}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"585.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":24,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.154042" elapsed="0.004972"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.153365" elapsed="0.005748"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.153307" elapsed="0.005917"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.163392" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.160217" elapsed="0.003314"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.159431" elapsed="0.004196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.159374" elapsed="0.004347"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.165249" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.164357" elapsed="0.000992"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.166008" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.165491" elapsed="0.000644"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.167053" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.166554" elapsed="0.000546"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.166203" elapsed="0.000966"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.165448" elapsed="0.001803"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.168650" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.167794" elapsed="0.000956"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.169406" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.168891" elapsed="0.000641"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.170538" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.169952" elapsed="0.000633"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.169601" elapsed="0.001055"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.168849" elapsed="0.001874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.171046" elapsed="0.000681"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.172641" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.172016" elapsed="0.000725"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.173191" elapsed="0.002401"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.152079" elapsed="0.023619"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.175944" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.175798" elapsed="0.000273"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.175779" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.179536" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.176239" elapsed="0.003326"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.179666" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.179856" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.133258" elapsed="0.046625"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.179941" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:16.180109" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.132529" elapsed="0.047606"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.181198" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.180683" elapsed="0.000544"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:16.181276" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.181452" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:16.180351" elapsed="0.001127"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.181830" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 77, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.181628" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.182224" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.182024" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:16.182295" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:16.182444" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:15.979140" elapsed="0.203328"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:16.182523" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:16.182664" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:19:15.978394" elapsed="0.204294"/>
</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-07T17:19:16.183043" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.182765" elapsed="0.000338"/>
</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="PASS" start="2026-04-07T17:19:16.183345" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.183127" elapsed="0.000443"/>
</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-07T17:19:16.183735" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.183594" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.182748" elapsed="0.001061"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:15.978233" elapsed="0.205599"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.186167" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.185805" elapsed="0.000388"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:16.186237" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.186383" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:16.185474" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.235275" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.234883" elapsed="0.000448"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.236096" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.235859" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.236251" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.235491" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.236812" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.236434" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.237146" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:16.237277" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:16.237008" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.237697" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.237453" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.238669" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.238418" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.239148" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.238865" elapsed="0.000309"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.239496" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.239695" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.239862" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.239368" elapsed="0.000550"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.239222" elapsed="0.000724"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:16.240005" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.240163" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:16.238105" elapsed="0.002082"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.237807" elapsed="0.002412"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.240384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.240243" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.237788" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.241032" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.240595" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.241107" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.234277" elapsed="0.006951"/>
</kw>
<msg time="2026-04-07T17:19:16.241280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.222534" elapsed="0.018852"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.253334" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.265170" elapsed="0.000065"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.277056" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.277456" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.277838" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.278359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.278218" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:16.278203" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.278575" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.278737" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.278898" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.278173" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.278037" elapsed="0.000966"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.279301" elapsed="0.000064"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.279470" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.279660" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:16.217036" elapsed="0.062673"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.282022" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.281760" elapsed="0.000326">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.282277" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.281347" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.282785" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.282459" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.283470" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.283144" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.282920" elapsed="0.000635"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.282418" elapsed="0.001192"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.286186" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.283907" elapsed="0.002325"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:16.286326" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:16.286610" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.280538" elapsed="0.006121"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.289009" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.288743" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.289266" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.288306" elapsed="0.001004"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:16.289671" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.289450" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.289408" elapsed="0.000425"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.290270" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.290646" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.290790" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.292812" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.287458" elapsed="0.005404"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.296513" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.296182" elapsed="0.000427"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.297275" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.296932" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.315536" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.316453" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:16.316909" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.299648" elapsed="0.017349"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.297506" elapsed="0.019653"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.317739" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.317291" elapsed="0.000640"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.297463" elapsed="0.020635"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.324419" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.320890" elapsed="0.003815"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.320586" elapsed="0.004169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.320556" elapsed="0.004233"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.328163" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.325195" elapsed="0.003016"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.324866" elapsed="0.003379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.324843" elapsed="0.003426"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.328797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.328425" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.329139" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.328892" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.329669" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.329372" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.329220" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.328874" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.330428" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.330060" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.330751" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.330527" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.331310" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.331013" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.330831" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.330506" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.331559" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.332347" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.332072" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.332519" elapsed="0.002123"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.319678" elapsed="0.015113"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.335145" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.334932" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.334890" elapsed="0.000378"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.341312" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.335595" elapsed="0.005766"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.341457" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:16.341744" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.293631" elapsed="0.048162"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.342028" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.342281" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.194509" elapsed="0.147798"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.342638" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.342391" elapsed="0.000694"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.342373" elapsed="0.000741"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.343148" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:16.190481" elapsed="0.152791"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.186472" elapsed="0.156842"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.186455" elapsed="0.156882"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:16.344030" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.343882" elapsed="0.000208"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.344149" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.344113" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.343865" elapsed="0.000345"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.344348" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:19:16.344466" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:16.343620" elapsed="0.000871"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.345031" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.344649" elapsed="0.000409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.345661" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.345208" elapsed="0.000479"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.351519" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.350941" elapsed="0.000659"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.352338" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.351764" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.364874" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.364995" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:16 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":77,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"477.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:16.365148" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.357195" elapsed="0.008005"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.352500" elapsed="0.012880"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.365586" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.365410" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.352481" elapsed="0.013337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.371073" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":77,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"477.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.367647" elapsed="0.003634"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.367146" elapsed="0.004231"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.367105" elapsed="0.004387"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.375448" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.372404" elapsed="0.003234"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.371697" elapsed="0.004036"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.371640" elapsed="0.004187"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.377317" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.376527" elapsed="0.000887"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.378065" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.377553" elapsed="0.000637"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.379090" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.378603" elapsed="0.000533"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.378257" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.377511" elapsed="0.001759"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.380653" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.379820" elapsed="0.000993"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.381470" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.380954" elapsed="0.000640"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.382505" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.382034" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.381663" elapsed="0.000957"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.380912" elapsed="0.001773"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.383010" elapsed="0.000660"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.384575" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.383940" elapsed="0.000734"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.384936" elapsed="0.002403"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.366274" elapsed="0.021175"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.387895" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.387747" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.387726" elapsed="0.000638"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.391532" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.388507" elapsed="0.003055"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.391661" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.391819" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.346627" elapsed="0.045218"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.391900" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:16.392069" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.345893" elapsed="0.046202"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.393177" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.392640" elapsed="0.000565"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:16.393298" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.393475" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:16.392309" elapsed="0.001193"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.393853" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 77, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.393654" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.394253" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.394052" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:16.394324" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.394471" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:16.184868" elapsed="0.209627"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:16.394552" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:16.394693" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:16.184170" elapsed="0.210547"/>
</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="PASS" start="2026-04-07T17:19:16.395023" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.394794" elapsed="0.000459"/>
</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-07T17:19:16.395419" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.395277" 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-07T17:19:16.395653" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.395509" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.394776" elapsed="0.000950"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:16.184006" elapsed="0.211744"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.398137" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.397728" elapsed="0.000435"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:16.398208" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:16.398353" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:16.397395" elapsed="0.000984"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.447419" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.447042" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.448213" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.447985" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.448369" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.447637" elapsed="0.000756"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.448931" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.448552" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.449266" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:16.449405" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:16.449129" elapsed="0.000335"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.449866" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.449619" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.450852" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.450596" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.451327" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.451063" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.451681" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.451879" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.452064" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.451538" elapsed="0.000585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.451404" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:16.452194" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.452350" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:16.450279" elapsed="0.002096"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.449993" elapsed="0.002413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.452574" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.452431" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.449958" elapsed="0.002693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.453229" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.452788" elapsed="0.000468"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.453304" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.446424" elapsed="0.007001"/>
</kw>
<msg time="2026-04-07T17:19:16.453477" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.434514" elapsed="0.019073"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.465436" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.477319" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.489070" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.489470" elapsed="0.000057"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.489854" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.490421" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.490279" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:16.490264" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.490637" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.490800" 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-07T17:19:16.490959" elapsed="0.000038"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.490233" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.490096" elapsed="0.000972"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.491369" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.491528" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.491730" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:16.429070" elapsed="0.062710"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.494121" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.493862" elapsed="0.000321">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.494375" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.493445" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.494888" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.494561" elapsed="0.000469"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.495623" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.495301" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.495093" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.494519" elapsed="0.001246"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.498255" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.496083" elapsed="0.002218"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:16.498395" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:19:16.498674" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.492622" elapsed="0.006102"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.501077" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.500812" elapsed="0.000328">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.501335" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.500405" elapsed="0.000974"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:16.501739" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.501519" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.501476" elapsed="0.000420"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.502216" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.502594" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.502740" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.504990" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.499558" elapsed="0.005489"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.508707" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.508377" elapsed="0.000426"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.509469" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.509145" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.525510" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.526416" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:16.526854" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.511804" elapsed="0.015111"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.509699" elapsed="0.017399"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.527726" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.527232" elapsed="0.000695"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.509657" elapsed="0.018396"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.533592" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.530096" elapsed="0.003791"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.529764" elapsed="0.004173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.529736" elapsed="0.004256"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.536954" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.534379" elapsed="0.002663"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.534074" elapsed="0.003003"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.534050" elapsed="0.003051"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.537623" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.537254" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.537953" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.537719" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.538514" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.538218" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.538063" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.537701" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.539135" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.538748" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.539455" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.539230" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.540010" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.539697" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.539535" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.539212" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.540238" elapsed="0.000421"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.541116" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.540818" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.541290" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.529013" elapsed="0.014538"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.543907" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.543714" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.543648" elapsed="0.000415"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.550093" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.544362" elapsed="0.005781"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.550241" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:19:16.550528" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.505777" elapsed="0.044804"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.550801" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.551075" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.406477" elapsed="0.144625"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.551438" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.551187" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.551169" elapsed="0.000760"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.551980" elapsed="0.000029"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:16.402480" elapsed="0.149629"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.398445" elapsed="0.153706"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.398428" elapsed="0.153747"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:16.552800" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.552696" elapsed="0.000162"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.552917" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.552881" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.552679" elapsed="0.000335"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.553156" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:19:16.553273" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:16.552432" elapsed="0.000865"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.553820" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.553457" elapsed="0.000389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.554468" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.554011" elapsed="0.000484"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.560331" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.559776" elapsed="0.000638"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.561225" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.560579" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.572342" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.572447" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:16 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Follower","LastApplied":77,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"229.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:16.572597" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.566003" elapsed="0.006643"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.561405" elapsed="0.011395"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.573232" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.572830" elapsed="0.000617"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.561385" elapsed="0.012087"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.578772" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":76,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":76,"Leader":"member-1-shard-topology-config","LastIndex":77,"RaftState":"Follower","LastApplied":77,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":77,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"229.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":77,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3022},"timestamp":1775582356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.575390" elapsed="0.003643"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.574869" elapsed="0.004265"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.574824" elapsed="0.004406"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.583385" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.580181" elapsed="0.003340"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.579434" elapsed="0.004184"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.579377" elapsed="0.004380"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.585381" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.584525" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.586162" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.585628" elapsed="0.000662"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.587228" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.586722" elapsed="0.000551"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.586359" elapsed="0.000982"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.585583" elapsed="0.001826"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.588830" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.588054" elapsed="0.000874"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.589604" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.589112" elapsed="0.000616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.590638" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.590168" elapsed="0.000514"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.589796" elapsed="0.000955"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.589069" elapsed="0.001746"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.591152" elapsed="0.000726"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.592807" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.592171" elapsed="0.000737"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.593346" elapsed="0.002497"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.573940" elapsed="0.022020"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.596235" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.596080" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.596060" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.599686" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.596518" elapsed="0.003197"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.599844" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:19:16.600034" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.555435" elapsed="0.044626"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.600119" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:16.600269" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.554698" elapsed="0.045597"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.601497" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.600890" elapsed="0.000635"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:16.601631" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.601810" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:16.600535" elapsed="0.001301"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.602213" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 77, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.602007" elapsed="0.000233"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.602587" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.602390" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:16.602658" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:16.602808" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:16.396784" elapsed="0.206048"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:16.602890" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:16.603060" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:16.396080" elapsed="0.207005"/>
</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="PASS" start="2026-04-07T17:19:16.603381" elapsed="0.000191"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.603167" elapsed="0.000442"/>
</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-07T17:19:16.603786" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.603633" 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-07T17:19:16.604019" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.603865" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.603150" elapsed="0.000944"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:16.395903" elapsed="0.208216"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.978034" elapsed="0.626121"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:16.604202" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:16.604404" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:19:16.604451" level="INFO">${follower_list} = [2, 3]</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-07T17:19:15.973868" elapsed="0.630606"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.604916" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:19:16.605060" level="INFO">${leader_count} = 1</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-07T17:19:16.604644" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.605368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.605156" elapsed="0.000265"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.605137" elapsed="0.000307"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.607495" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:19:16.605575" elapsed="0.001967"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:16.607916" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.607703" elapsed="0.000238"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:16.608003" 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="PASS" start="2026-04-07T17:19:15.971382" elapsed="0.636776"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:19:15.971169" elapsed="0.637035"/>
</iter>
<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-07T17:19:16.612654" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.612271" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.613279" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:16.612952" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:16.613349" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.613501" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.611871" elapsed="0.001655"/>
</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-07T17:19:16.613675" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.614335" 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-07T17:19:16.614001" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.614749" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:16.614514" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.615167" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:16.614917" elapsed="0.000276"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.617647" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.617305" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:16.617719" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.617864" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:16.616955" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.668602" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.668227" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.669385" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.669134" elapsed="0.000327">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.669554" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.668790" elapsed="0.000788"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.670133" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.669738" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.670451" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:16.670615" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:16.670317" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.671049" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.670791" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.672050" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.671757" elapsed="0.000337"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.672513" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.672247" elapsed="0.000292"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.672844" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.673063" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.673231" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.672718" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.672587" elapsed="0.000768"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:16.673398" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.673554" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:16.671445" elapsed="0.002134"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.671161" elapsed="0.002450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.673777" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.673635" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.671142" elapsed="0.002711"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.674430" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.674003" elapsed="0.000455"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.674505" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.667602" elapsed="0.007025"/>
</kw>
<msg time="2026-04-07T17:19:16.674681" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.655933" elapsed="0.018855"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.686620" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.698537" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.710244" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.710643" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.711046" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.711553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.711412" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:16.711398" elapsed="0.000234"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.711766" 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-07T17:19:16.711952" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.712132" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.711367" elapsed="0.000819"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.711232" elapsed="0.000992"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.712525" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.712734" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:19:16.712956" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:16.650384" elapsed="0.062644"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.715484" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.715196" elapsed="0.000365">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.715760" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.714733" elapsed="0.001072"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.716374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.716026" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.717064" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.716740" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.716513" elapsed="0.000637"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.715920" elapsed="0.001287"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.719928" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.717510" elapsed="0.002523"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:16.720133" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:19:16.720421" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.713883" elapsed="0.006588"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.722766" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.722517" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.723042" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.722108" elapsed="0.000981"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:16.723490" elapsed="0.000031"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.723229" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.723187" elapsed="0.000470"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.724081" elapsed="0.000058"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.724462" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.724608" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.726643" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.721275" elapsed="0.005419"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.734236" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.733402" elapsed="0.001050"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.736216" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.735228" elapsed="0.001207"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.749808" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.750489" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:16.750843" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.741270" elapsed="0.009614"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.736741" elapsed="0.014269"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.751436" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.751113" elapsed="0.000456"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.736648" elapsed="0.015005"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.758044" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.754032" elapsed="0.004338"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.753667" elapsed="0.004757"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.753637" elapsed="0.004825"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.761838" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.758887" elapsed="0.002998"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.758547" elapsed="0.003383"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.758521" elapsed="0.003435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.762547" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.762132" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.762891" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.762645" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.763473" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.763148" elapsed="0.000351"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.762990" elapsed="0.000546"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.762626" elapsed="0.000931"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.764128" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.763724" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.764478" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.764240" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.765044" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.764717" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.764563" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.764208" elapsed="0.000920"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.765274" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.766120" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.765798" elapsed="0.000348"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.766298" elapsed="0.002196"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.752799" elapsed="0.015850"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.769016" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.768796" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.768751" elapsed="0.000396"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.775217" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.769458" elapsed="0.005810"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.775367" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:19:16.775673" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.727458" elapsed="0.048269"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.775993" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:19:16.776268" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.627362" elapsed="0.148934"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.776647" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.776382" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.776364" elapsed="0.000778"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.777178" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:16.623378" elapsed="0.153928"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.617956" elapsed="0.159395"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.617938" elapsed="0.159438"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:16.778070" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.777924" elapsed="0.000207"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.778192" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.778154" elapsed="0.000077"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.777905" elapsed="0.000349"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.778397" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:19:16.778517" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:16.777651" elapsed="0.000892"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.779113" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.778714" elapsed="0.000426"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.780002" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.779293" elapsed="0.000740"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.786338" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.785626" elapsed="0.000798"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.787208" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.786592" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.798560" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.798677" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:16 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:16 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.238","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.237","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"567.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582356,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:16.798874" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.792469" elapsed="0.006469"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.787421" elapsed="0.011708"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.799360" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.799164" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.787400" elapsed="0.012200"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.805605" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.238","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.237","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"567.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582356,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.802029" elapsed="0.003747"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.801348" elapsed="0.004531"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.801303" elapsed="0.004702"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.810019" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.806989" elapsed="0.003131"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.806242" elapsed="0.003972"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.806180" elapsed="0.004105"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.811756" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.810866" elapsed="0.000994"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.812571" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.812037" elapsed="0.000668"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.813709" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.813218" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.812776" elapsed="0.001053"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.811962" elapsed="0.001936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.815309" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.814477" elapsed="0.000934"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.816175" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.815557" elapsed="0.000762"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.817327" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.816766" elapsed="0.000610"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.816391" elapsed="0.001055"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.815514" elapsed="0.002013"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.817846" elapsed="0.000760"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.819589" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.818897" elapsed="0.000791"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.820118" elapsed="0.002808"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.800287" elapsed="0.022773"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.823333" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.823164" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.823143" elapsed="0.000454"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:16.827265" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.823758" elapsed="0.003536"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:16.827399" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:16.827691" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.781009" elapsed="0.046710"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.827780" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:16.827931" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.780252" elapsed="0.047706"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.829291" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.828740" elapsed="0.000580"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:16.829370" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:16.829578" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582356, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:16.828348" elapsed="0.001259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.829991" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.829762" elapsed="0.000259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:16.830390" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.830174" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:16.830462" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:19:16.830632" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:16.616362" elapsed="0.214295"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:16.830715" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:16.830865" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:19:16.615612" elapsed="0.215278"/>
</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-07T17:19:16.831220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.831002" 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="PASS" start="2026-04-07T17:19:16.831516" elapsed="0.000202"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.831303" elapsed="0.000453"/>
</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-07T17:19:16.831941" elapsed="0.000139"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.831795" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.830981" elapsed="0.001164"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:16.615449" elapsed="0.216723"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.834731" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.834374" elapsed="0.000384"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:16.834803" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:16.834950" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:16.834016" elapsed="0.000975"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.885160" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.884765" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.886082" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.885775" elapsed="0.000392">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.886263" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.885359" elapsed="0.000930"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.886871" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.886481" elapsed="0.000417"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.887236" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:16.887405" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:16.887090" elapsed="0.000360"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.887858" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.887609" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.888928" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.888660" elapsed="0.000330"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.889438" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.889150" elapsed="0.000323"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.889819" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.890040" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.890212" elapsed="0.000037"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.889676" elapsed="0.000610"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.889532" elapsed="0.000785"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:16.890362" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:16.890535" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:16.888331" elapsed="0.002230"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.888001" elapsed="0.002594"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.890763" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.890620" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.887979" elapsed="0.002879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.891475" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.891016" elapsed="0.000492"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:16.891556" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:16.884110" elapsed="0.007573"/>
</kw>
<msg time="2026-04-07T17:19:16.891738" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.872113" elapsed="0.019744"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.904440" elapsed="0.000064"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.916774" elapsed="0.000071"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.931160" elapsed="0.000185"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.932283" elapsed="0.000125"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.933176" elapsed="0.000118"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.934424" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.934096" elapsed="0.000454"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:16.934057" elapsed="0.000549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.934910" elapsed="0.000046"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.935302" elapsed="0.000045"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.935662" elapsed="0.000044"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:16.933948" elapsed="0.001830"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.933602" elapsed="0.002259"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.936629" elapsed="0.000122"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.937011" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:19:16.937367" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:16.866415" elapsed="0.071032"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.941390" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.940924" elapsed="0.000573">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.941787" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.940220" elapsed="0.001633"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.942600" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.942086" elapsed="0.000629"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.943608" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.943160" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.942802" elapsed="0.000930"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.942019" elapsed="0.001796"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.946932" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:16.944396" elapsed="0.002596"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:16.947092" elapsed="0.000079"/>
</return>
<msg time="2026-04-07T17:19:16.947402" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.938838" elapsed="0.008613"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:16.950091" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:16.949811" elapsed="0.000359">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:16.950368" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:16.949320" elapsed="0.001092"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:16.950784" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:16.950558" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.950516" elapsed="0.000430"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.951282" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.951684" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.951831" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:16.954015" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:16.948407" elapsed="0.005658"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.957711" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.957367" elapsed="0.000442"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.958481" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.958156" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:16.976006" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:16.976630" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:16.976928" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:16.960768" elapsed="0.016215"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.958713" elapsed="0.018410"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.977710" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.977259" elapsed="0.000645"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.958672" elapsed="0.019400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.986008" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.981493" elapsed="0.004723"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.980995" elapsed="0.005257"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.980920" elapsed="0.005357"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.988687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:16.986551" elapsed="0.002181"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.986333" elapsed="0.002434"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.986315" elapsed="0.002476"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.989406" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.988962" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.989734" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.989501" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.990288" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.989986" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.989815" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.989483" elapsed="0.000888"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.990884" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.990523" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:16.991223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:16.990994" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:16.991746" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:16.991454" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.991303" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.990960" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:16.991988" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:16.992822" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:16.992523" elapsed="0.000324"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:16.993013" elapsed="0.002143"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:16.979683" elapsed="0.015622"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:16.995633" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:16.995442" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.995402" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:17.001885" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:16.996076" elapsed="0.005859"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:17.002052" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:19:17.002346" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:16.954816" elapsed="0.047581"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.002619" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:17.002985" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:16.843148" elapsed="0.159867"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.003359" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.003103" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.003085" elapsed="0.000797"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.003916" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:16.839039" elapsed="0.165029"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:16.835067" elapsed="0.169045"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:16.835046" elapsed="0.169090"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:17.004792" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.004686" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.004911" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.004875" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.004669" elapsed="0.000328"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.005146" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:19:17.005264" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:17.004419" elapsed="0.000871"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.005816" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.005449" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.006464" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.006009" elapsed="0.000482"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.012412" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.011838" elapsed="0.000656"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.013275" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.012658" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:17.024960" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:17.025397" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:17 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"191.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582357,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:17.025607" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:17.018089" elapsed="0.007589"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.013440" elapsed="0.012451"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.026210" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.025933" elapsed="0.000567"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.013421" elapsed="0.013115"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.032711" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"191.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582357,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.029353" elapsed="0.003565"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.028631" elapsed="0.004407"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.028571" elapsed="0.004556"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.036117" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.033755" elapsed="0.002472"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.033274" elapsed="0.003033"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.033233" elapsed="0.003143"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.037837" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.036989" elapsed="0.000957"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.038641" elapsed="0.000061"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.038109" elapsed="0.000668"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.039753" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.039248" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.038849" elapsed="0.001028"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.038066" elapsed="0.001881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.041479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.040635" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.042276" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.041741" elapsed="0.000663"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.043333" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.042835" elapsed="0.000544"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.042477" elapsed="0.000972"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.041695" elapsed="0.001822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.043830" elapsed="0.000788"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:17.045526" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.044897" elapsed="0.000730"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.045892" elapsed="0.002603"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:17.027273" elapsed="0.021331"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.048848" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.048702" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.048683" elapsed="0.000319"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:17.052326" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:17.049148" elapsed="0.003214"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:17.052468" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:19:17.052631" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:17.007431" elapsed="0.045226"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.052724" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:17.052879" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:17.006699" elapsed="0.046206"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.053977" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582357, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.053475" elapsed="0.000532"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:17.054103" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:17.054282" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582357, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:17.053140" elapsed="0.001169"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.054660" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.054460" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.055055" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.054836" elapsed="0.000245"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:17.055128" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:17.055279" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:16.833357" elapsed="0.221947"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:17.055363" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:17.055511" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:16.832551" elapsed="0.222985"/>
</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="PASS" start="2026-04-07T17:19:17.055831" elapsed="0.000279"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.055617" elapsed="0.000532"/>
</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-07T17:19:17.056343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.056174" elapsed="0.000226"/>
</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-07T17:19:17.056561" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.056424" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.055600" elapsed="0.001034"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:16.832353" elapsed="0.224306"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.059082" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.058725" elapsed="0.000383"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:17.059153" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:17.059299" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:17.058391" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.109023" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.108621" elapsed="0.000432"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:17.109880" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:17.109578" elapsed="0.000400">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:17.110115" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:17.109241" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.110918" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:17.110373" elapsed="0.000581"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:19:17.111390" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:19:17.111613" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:19:17.111195" elapsed="0.000516"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.112400" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.112007" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.113570" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.113318" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.114054" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.113768" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.114426" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.114628" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.114801" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:19:17.114289" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.114140" elapsed="0.000749"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:19:17.114937" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:19:17.115122" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:19:17.112992" elapsed="0.002155"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.112564" elapsed="0.002615"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.115347" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.115204" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.112533" elapsed="0.002904"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.116035" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.115577" elapsed="0.000485"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.116110" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:19:17.107882" elapsed="0.008349"/>
</kw>
<msg time="2026-04-07T17:19:17.116285" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.095959" elapsed="0.020448"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.128548" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.140276" elapsed="0.000076"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.152036" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.152464" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.152846" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.153407" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.153265" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:17.153250" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.153623" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.153787" 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-07T17:19:17.153990" elapsed="0.000027"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:19:17.153219" elapsed="0.000835"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.153083" elapsed="0.001009"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.154407" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.154566" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:17.154761" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:19:17.090388" elapsed="0.064427"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:17.157746" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:17.157436" elapsed="0.000397">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:17.158087" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:17.156876" elapsed="0.001266"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.158738" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.158318" elapsed="0.000518"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.159585" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.159215" elapsed="0.000403"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.158910" elapsed="0.000781"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.158265" elapsed="0.001500"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.163231" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:17.160183" elapsed="0.003105"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:19:17.163411" elapsed="0.000082"/>
</return>
<msg time="2026-04-07T17:19:17.163769" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:17.155830" elapsed="0.008002"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:19:17.166589" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:19:17.166321" elapsed="0.000335">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:19:17.166855" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:19:17.165876" elapsed="0.001025"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:19:17.167296" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.167067" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.167023" elapsed="0.000436"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.167769" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.168173" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.168321" elapsed="0.000105"/>
</return>
<msg time="2026-04-07T17:19:17.172225" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:19:17.164836" elapsed="0.007441"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.175879" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.175544" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.176663" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.176321" elapsed="0.000436"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:17.192487" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:17.193423" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:19:17.193890" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:17.178957" elapsed="0.014992"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.176896" elapsed="0.017234"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.194711" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.194263" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.176855" elapsed="0.018205"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.202413" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.198385" elapsed="0.004241"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.197865" elapsed="0.004797"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.197819" elapsed="0.004868"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.205128" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.202979" elapsed="0.002194"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.202743" elapsed="0.002464"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.202726" elapsed="0.002505"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.205801" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.205402" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.206147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.205896" elapsed="0.000309"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.206680" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.206384" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.206229" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.205878" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.207296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.206915" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.207616" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.207390" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.208166" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.207847" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.207696" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.207372" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.208419" elapsed="0.000348"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:17.209236" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.208925" elapsed="0.000337"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.209409" elapsed="0.002120"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:17.196633" elapsed="0.015047"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.212033" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.211820" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.211778" elapsed="0.000381"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:17.218254" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:17.212482" elapsed="0.005821"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:17.218400" elapsed="0.000067"/>
</return>
<msg time="2026-04-07T17:19:17.218693" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:17.173115" elapsed="0.045630"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.218981" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:17.219240" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:19:17.067430" elapsed="0.151837"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.219606" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.219351" elapsed="0.000752"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.219334" elapsed="0.000800"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.220168" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:19:17.063406" elapsed="0.156888"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.059389" elapsed="0.160947"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.059372" elapsed="0.160988"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:19:17.221043" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.220901" elapsed="0.000201"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.221162" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.221125" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.220884" elapsed="0.000339"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.221362" elapsed="0.000020"/>
</kw>
<msg time="2026-04-07T17:19:17.221478" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:19:17.220635" elapsed="0.000868"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.222049" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.221663" elapsed="0.000413"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.222680" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.222226" elapsed="0.000481"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.228816" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.228243" elapsed="0.000657"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.229687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.229153" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:17.241343" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:17.241448" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:19:17 GMT', 'Expires': 'Tue, 07 Apr 2026 16:19:17 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"209.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582357,"status":200} 
 </msg>
<msg time="2026-04-07T17:19:17.241633" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:17.234454" elapsed="0.007252"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.229852" elapsed="0.012081"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.242265" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.241998" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.229833" elapsed="0.012776"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.248873" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"209.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582357,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.245440" elapsed="0.003664"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.244694" elapsed="0.004480"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.244632" elapsed="0.004610"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.252203" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.249864" elapsed="0.002435"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.249385" elapsed="0.002982"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.249344" elapsed="0.003107"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.253793" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.253009" elapsed="0.000883"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.254552" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.254052" elapsed="0.000625"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.255624" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.255117" elapsed="0.000553"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.254746" elapsed="0.000994"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.254008" elapsed="0.001797"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.257182" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.256363" elapsed="0.000919"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.257917" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.257423" elapsed="0.000636"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.258950" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:17.258479" elapsed="0.000532"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.258128" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.257380" elapsed="0.001767"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.259453" elapsed="0.000696"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:17.261059" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.260421" elapsed="0.000737"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.261423" elapsed="0.002405"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:17.243288" elapsed="0.020646"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.264195" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.264049" elapsed="0.000259"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.264029" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:19:17.267793" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:19:17.264502" elapsed="0.003320"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:19:17.267921" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:17.268097" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:17.223870" elapsed="0.044253"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:17.268178" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:17.268325" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755823...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:19:17.222913" elapsed="0.045438"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.269414" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582357, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:17.268911" elapsed="0.000532"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:17.269533" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:17.269711" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582357, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:17.268578" elapsed="0.001160"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.270205" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.269889" elapsed="0.000344"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.270584" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.270385" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:19:17.270655" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:17.270803" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:19:17.057773" elapsed="0.213054"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:19:17.270882" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:19:17.271041" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:19:17.057018" elapsed="0.214049"/>
</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="PASS" start="2026-04-07T17:19:17.271358" elapsed="0.000379"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:17.271146" elapsed="0.000631"/>
</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-07T17:19:17.271949" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.271803" elapsed="0.000218"/>
</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-07T17:19:17.272185" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.272045" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.271129" elapsed="0.001130"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:17.056833" elapsed="0.215451"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:16.615247" elapsed="0.657070"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:17.272363" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:17.272587" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:19:17.272634" level="INFO">${follower_list} = [2, 3]</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-07T17:19:16.611019" elapsed="0.661638"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.273115" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:19:17.273191" level="INFO">${leader_count} = 1</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-07T17:19:17.272828" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.273494" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.273285" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.273266" elapsed="0.000305"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.275614" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:19:17.273700" elapsed="0.001961"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:17.276019" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.275819" elapsed="0.000226"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:19:17.276092" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:19:16.608526" elapsed="0.667719"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:19:16.608297" elapsed="0.667993"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:19:15.971039" elapsed="1.305281"/>
</for>
<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="PASS" start="2026-04-07T17:19:15.970618" elapsed="1.305756"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:19:14.574590" elapsed="2.701917"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:19:14.226251" elapsed="3.050396"/>
</test>
<test id="s1-s2-s1-t2" name="Start OVS Multiple Connections" line="21">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:17.279786" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:17.279528" 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-07T17:19:17.281063" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.280935" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.280917" 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-07T17:19:17.285643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.285537" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.285520" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.286689" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:17.286315" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.287186" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:17.286870" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:17.287255" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:17.287406" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:17.285926" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.292706" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.292598" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.292578" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.293981" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.293857" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.293839" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.294537" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.294190" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.294980" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:17.294715" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.325425" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:17.295544" elapsed="0.030044"/>
</kw>
<msg time="2026-04-07T17:19:17.325760" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:17.325806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.295163" elapsed="0.030680"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.371928" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:17.326419" elapsed="0.045707"/>
</kw>
<msg time="2026-04-07T17:19:17.372294" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:17.372340" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.326028" elapsed="0.046346"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.372706" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.372451" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.372432" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.373345" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.372947" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.373748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.373535" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.373516" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:17.373882" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.376204" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:19:17.377693" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:17.379198" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:17.374744" elapsed="0.004849"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:17.374169" elapsed="0.005537"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:17.293558" elapsed="0.086248"/>
</kw>
<msg time="2026-04-07T17:19:17.379897" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.379941" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.292920" elapsed="0.087072"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:17.380183" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.380076" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.380057" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.380668" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.381025" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.381099" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:17.292229" elapsed="0.088977"/>
</kw>
<msg time="2026-04-07T17:19:17.381297" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.381341" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.287797" elapsed="0.093579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.381692" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.381450" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.381433" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:17.287658" elapsed="0.094134"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.387298" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.387190" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.387171" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.388574" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.388454" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.388437" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.389164" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.388790" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.389594" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:17.389346" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.421649" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:17.390165" elapsed="0.031639"/>
</kw>
<msg time="2026-04-07T17:19:17.422085" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:17.422133" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.389772" elapsed="0.032397"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.467872" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:17.422724" elapsed="0.045352"/>
</kw>
<msg time="2026-04-07T17:19:17.468244" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:17.468290" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.422335" elapsed="0.045989"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.468621" elapsed="0.000043"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.468403" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.468383" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.469283" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.468891" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.469634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.469426" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.469408" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:17.469765" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.472110" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:19:17.473568" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:17.474945" elapsed="0.000356"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:17.470648" elapsed="0.004724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:17.470039" elapsed="0.005448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:17.388154" elapsed="0.087434"/>
</kw>
<msg time="2026-04-07T17:19:17.475679" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.475723" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.387511" elapsed="0.088247"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:17.475941" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.475835" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.475816" elapsed="0.000291"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.476490" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.476827" elapsed="0.000030"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.476906" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:17.386831" elapsed="0.090212"/>
</kw>
<msg time="2026-04-07T17:19:17.477136" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.477179" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.382186" elapsed="0.095029"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.477584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.477339" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.477320" elapsed="0.000342"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:17.381915" elapsed="0.095770"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.483064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.482939" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.482921" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.484312" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:17.484205" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.484187" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:17.485070" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.484584" elapsed="0.000516"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.485504" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:17.485256" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.516546" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:17.486078" elapsed="0.030674"/>
</kw>
<msg time="2026-04-07T17:19:17.516923" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:17.516988" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.485684" elapsed="0.031341"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.561182" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:17.517573" elapsed="0.043794"/>
</kw>
<msg time="2026-04-07T17:19:17.561537" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:17.561583" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.517189" elapsed="0.044428"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.561914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.561695" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.561675" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.562554" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "C "o "n "n "[78Ce "[A[78Cc
 "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:17.562182" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.562909" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.562697" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.562679" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:17.563058" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.565354" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:17.566787" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:17.568175" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:17.563877" elapsed="0.004683"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:17.563308" elapsed="0.005364"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:17.483887" elapsed="0.084899"/>
</kw>
<msg time="2026-04-07T17:19:17.568921" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.568979" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.483279" elapsed="0.085738"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:17.569204" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:17.569095" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.569076" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.569669" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.570021" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:17.570093" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:17.482596" elapsed="0.087606"/>
</kw>
<msg time="2026-04-07T17:19:17.570294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:17.570338" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.477940" elapsed="0.092432"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:17.570692" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.570448" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.570430" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:17.477807" elapsed="0.092985"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:17.287486" elapsed="0.283335"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:17.285181" elapsed="0.285696"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:17.280652" elapsed="0.290281"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:17.280207" elapsed="0.290801"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:17.277568" elapsed="0.293498"/>
</kw>
<kw name="Add Multiple Managers to OVS" owner="OVSDB">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.578129" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:17.577731" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.578617" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:17.578310" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:17.578687" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:17.578840" level="INFO">${index_list} = [1, 2, 3]</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-07T17:19:17.577363" elapsed="0.001502"/>
</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-07T17:19:17.581567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:17.581264" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:17.581245" elapsed="0.000403"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.581941" 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-07T17:19:17.582066" 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-07T17:19:17.581792" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.582622" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:19:17.582241" elapsed="0.000426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.583245" level="INFO">${conn_id} = 405</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-07T17:19:17.582855" elapsed="0.000416"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:17.584168" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:17.584243" 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-07T17:19:17.583872" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.584420" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.585592" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:17.913825" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:10 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:17.585278" elapsed="0.328879"/>
</kw>
<msg time="2026-04-07T17:19:17.914325" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.584910" elapsed="0.329579"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:17.583482" elapsed="0.331240"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:17.915698" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:19:19.053601" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:19.054037" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:19.054152" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:17.915202" elapsed="1.139010"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.054666" elapsed="0.000599"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.056369" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.055670" elapsed="0.000821"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.056959" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:19.056665" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.056615" elapsed="0.000541"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:19.057514" elapsed="0.000066"/>
</return>
<status status="PASS" start="2026-04-07T17:19:19.057277" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.057242" elapsed="0.000466"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.057784" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.063417" elapsed="0.000345"/>
</kw>
<kw name="Open 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-07T17:19:19.063923" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.064248" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:19.058536" elapsed="0.005865"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:17.580699" elapsed="1.483794"/>
</kw>
<msg time="2026-04-07T17:19:19.064625" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:17.580160" elapsed="1.484519"/>
</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="PASS" start="2026-04-07T17:19:17.579664" elapsed="1.485098"/>
</kw>
<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-07T17:19:19.066838" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:19.066574" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.066555" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.067216" 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-07T17:19:19.067319" 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-07T17:19:19.067080" elapsed="0.000265"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.067872" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:19:19.067493" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.068450" level="INFO">${conn_id} = 407</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-07T17:19:19.068086" elapsed="0.000389"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.069370" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:19.069447" 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-07T17:19:19.069092" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.069624" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.070813" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:19.404084" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:17 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:19.070499" elapsed="0.333711"/>
</kw>
<msg time="2026-04-07T17:19:19.404280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.070146" elapsed="0.334207"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:19.068686" elapsed="0.335774"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.404874" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:19:19.437949" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:19:19.438259" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:19.438369" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:19.404665" elapsed="0.033756"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.438777" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.440266" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.439649" elapsed="0.000708"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.440788" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:19.440519" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.440472" elapsed="0.000471"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:19.441325" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:19:19.441093" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.441058" elapsed="0.000453"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.441654" elapsed="0.000040"/>
</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-07T17:19:19.447391" elapsed="0.000313"/>
</kw>
<kw name="Open 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-07T17:19:19.447864" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.448178" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:19.442538" elapsed="0.005787"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:19.066034" elapsed="0.382382"/>
</kw>
<msg time="2026-04-07T17:19:19.448470" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.065449" elapsed="0.383069"/>
</kw>
<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="PASS" start="2026-04-07T17:19:19.064936" elapsed="0.383661"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:19:17.579314" elapsed="1.869339"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.449058" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:19.448799" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.449833" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:19.449420" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.450286" level="INFO">  tcp:10.30.170.175:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.450032" elapsed="0.000297"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:19.449290" elapsed="0.001071"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.450993" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:19.450576" elapsed="0.000444"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.451413" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.451171" elapsed="0.000286"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:19.450451" elapsed="0.001039"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.452120" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:19.451699" elapsed="0.000448"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.452535" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.452298" elapsed="0.000280"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:19.451575" elapsed="0.001035"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:19.449140" elapsed="0.003499"/>
</for>
<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-07T17:19:19.454753" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:19.454492" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.454472" elapsed="0.000360"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.455126" 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-07T17:19:19.455225" 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-07T17:19:19.454991" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.455771" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640" on remote system "10.30.171.56" 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-07T17:19:19.455397" elapsed="0.000419"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.456340" level="INFO">${conn_id} = 409</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-07T17:19:19.455979" elapsed="0.000387"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.457468" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:19.457544" 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-07T17:19:19.457198" elapsed="0.000370"/>
</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-07T17:19:19.457722" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.458905" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:19.779677" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:19 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:19.458593" elapsed="0.321186"/>
</kw>
<msg time="2026-04-07T17:19:19.779843" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.458243" elapsed="0.321662"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:19.456786" elapsed="0.323231"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.780398" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640'.</msg>
<msg time="2026-04-07T17:19:19.843068" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:19.843327" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:19.843423" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:19.780208" elapsed="0.063265"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.843829" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.845312" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:19.844685" elapsed="0.000719"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.845822" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:19.845562" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.845518" elapsed="0.000485"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:19.846356" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:19:19.846125" elapsed="0.000431"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.846091" elapsed="0.000530"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:19.846699" elapsed="0.000033"/>
</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-07T17:19:19.852433" elapsed="0.000714"/>
</kw>
<kw name="Open 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-07T17:19:19.853500" elapsed="0.000320"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:19.854168" elapsed="0.000216"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:19.847400" elapsed="0.007149"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:19.453912" elapsed="0.400841"/>
</kw>
<msg time="2026-04-07T17:19:19.854868" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.453365" elapsed="0.401637"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl set-manager ${ovs_opt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:19.452829" elapsed="0.402348"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:19:19.866139" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:19.865859" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:19.865840" elapsed="0.000425"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.866563" 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-07T17:19:19.866666" 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-07T17:19:19.866409" elapsed="0.000283"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.867232" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:19:19.866839" elapsed="0.000439"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.867783" level="INFO">${conn_id} = 411</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-07T17:19:19.867428" elapsed="0.000380"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:19.868688" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:19.868762" 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-07T17:19:19.868424" 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-07T17:19:19.868937" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:19.870589" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:20.180046" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:19 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:19.869775" elapsed="0.310495"/>
</kw>
<msg time="2026-04-07T17:19:20.180378" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.869429" elapsed="0.311055"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:19.868032" elapsed="0.312608"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:20.181331" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:19:20.203858" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:20.204044" level="INFO">${stdout} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-04-07T17:19:20.204109" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:20.180989" elapsed="0.023153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:20.204366" elapsed="0.000664"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:20.205711" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:20.205317" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:20.206093" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:20.205885" elapsed="0.000280"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:20.205847" elapsed="0.000351"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:20.206409" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-07T17:19:20.206270" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:20.206250" elapsed="0.000264"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:20.206557" elapsed="0.000020"/>
</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-07T17:19:20.210211" elapsed="0.000490"/>
</kw>
<kw name="Open 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-07T17:19:20.210928" elapsed="0.000242"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:20.211371" elapsed="0.000134"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:20.207029" elapsed="0.004549"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:19.865336" elapsed="0.346366"/>
</kw>
<msg time="2026-04-07T17:19:20.211848" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:19.864777" elapsed="0.347141"/>
</kw>
<msg time="2026-04-07T17:19:20.212102" level="INFO">${output} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:19.864263" elapsed="0.347876"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:20.212694" level="INFO">f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:20.212354" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-07T17:19:20.213696" level="FAIL">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-07T17:19:20.213170" elapsed="0.000610">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:20.212849" elapsed="0.001016">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:20.212823" elapsed="0.001090">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:20.214236" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:20.214030" elapsed="0.000285"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:20.214005" elapsed="0.000344"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:19:20.214394" elapsed="0.000020"/>
</return>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="FAIL" start="2026-04-07T17:19:19.863800" elapsed="0.350745">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:19:20.214634" elapsed="0.000021"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-04-07T17:19:19.855840" elapsed="0.358950">'f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:19:21.231285" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.230942" elapsed="0.000415"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.230917" elapsed="0.000466"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.231698" 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-07T17:19:21.231809" 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-07T17:19:21.231529" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.232684" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:19:21.232000" elapsed="0.000732"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.233284" level="INFO">${conn_id} = 413</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-07T17:19:21.232885" elapsed="0.000424"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.235936" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:21.236032" 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-07T17:19:21.235638" elapsed="0.000419"/>
</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-07T17:19:21.236216" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.237870" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:21.562860" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:20 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:21.237078" elapsed="0.325968"/>
</kw>
<msg time="2026-04-07T17:19:21.563130" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:21.236712" elapsed="0.326498"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:21.233520" elapsed="0.329815"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.563816" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:19:21.586118" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:21.586361" level="INFO">${stdout} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<msg time="2026-04-07T17:19:21.586460" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:21.563574" elapsed="0.022937"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:21.586861" elapsed="0.000517"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.588438" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.587781" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.589037" elapsed="0.000041"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.588705" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.588653" elapsed="0.000549"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:21.589552" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:19:21.589318" elapsed="0.000362"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.589285" elapsed="0.000448"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.589805" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:21.595899" elapsed="0.000559"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.596618" elapsed="0.000158"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:21.596920" elapsed="0.000112"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:21.590525" elapsed="0.006558"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:21.230401" elapsed="0.366773"/>
</kw>
<msg time="2026-04-07T17:19:21.597230" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:21.229786" elapsed="0.367496"/>
</kw>
<msg time="2026-04-07T17:19:21.597397" level="INFO">${output} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:21.229256" elapsed="0.368166"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.597820" level="INFO">f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.597577" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-07T17:19:21.598380" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:21.597931" elapsed="0.000833"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.597913" elapsed="0.000876"/>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.599081" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.598845" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.598828" elapsed="0.000388"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:19:21.599249" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:19:21.599421" level="INFO">${output} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="PASS" start="2026-04-07T17:19:21.228767" elapsed="0.370681"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:19:21.599499" elapsed="0.000025"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-04-07T17:19:21.215603" elapsed="0.384013"/>
</kw>
<msg time="2026-04-07T17:19:21.599696" level="INFO">${output} = f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>5s</arg>
<arg>1s</arg>
<arg>Verify OVS Reports Connected</arg>
<arg>${tools_system}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:19:19.855353" elapsed="1.744369"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.600152" level="INFO">f72038e3-f28b-4edd-aba9-2c02ed31546c
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.599879" elapsed="0.000319"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:21.600541" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${index_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.600348" elapsed="0.000219"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.601437" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:21.601144" elapsed="0.000318"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:21.601506" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:21.601651" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${controller_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:21.600781" elapsed="0.000894"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.610551" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:21.608669" elapsed="0.001908"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:21.619250" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:21.620613" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1376'} 
 body={"network-topology:topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]} 
 </msg>
<msg time="2026-04-07T17:19:21.620789" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${controller_http_session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_OVSDB1_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:21.610731" elapsed="0.010095"/>
</kw>
<kw name="Log Content" owner="Utils">
<if>
<branch type="IF" condition="'''${resp_content}''' != '${EMPTY}'">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.627887" level="INFO">${resp_json} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c",
                    "ovsdb:co...</msg>
<var>${resp_json}</var>
<arg>json.dumps(json.loads('''${resp_content}'''), sort_keys=True, indent=4, separators=(',', ': '))</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:21.626896" elapsed="0.001030"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:21.624318" elapsed="0.003685"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.628241" elapsed="0.000275"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.628040" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.624291" elapsed="0.004288"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.628994" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c",
                    "ovsdb:connection-info": {
                        "local-ip": "10.30.170.175",
                        "local-port": 6640,
                        "remote-ip": "10.30.171.56",
                        "remote-port": 59846
                    },
                    "ovsdb:datapath-type-entry": [
                        {
                            "datapath-type": "ovsdb:datapath-type-netdev"
                        },
                        {
                            "datapath-type": "ovsdb:datapath-type-system"
                        }
                    ],
                    "ovsdb:db-version": "8.3.0",
                    "ovsdb:interface-type-entry": [
                        {
                            "interface-type": "ovsdb:interface-type-vxlan"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-tap"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-stt"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-internal"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-patch"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-lisp"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-geneve"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-gre"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-system"
                        }
                    ],
                    "ovsdb:manager-entry": [
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.171.205:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.175:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.206:6640"
                        }
                    ],
                    "ovsdb:openvswitch-external-ids": [
                        {
                            "external-id-key": "system-id",
                            "external-id-value": ""
                        },
                        {
                            "external-id-key": "hostname",
                            "external-id-value": "localhost"
                        },
                        {
                            "external-id-key": "rundir",
                            "external-id-value": "/var/run/openvswitch"
                        }
                    ],
                    "ovsdb:ovs-version": "2.17.11"
                }
            ],
            "topology-id": "ovsdb:1"
        }
    ]
}</msg>
<arg>${resp_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.628724" elapsed="0.000381"/>
</kw>
<return>
<value>${resp_json}</value>
<status status="PASS" start="2026-04-07T17:19:21.629148" elapsed="0.000029"/>
</return>
<arg>${resp.text}</arg>
<status status="PASS" start="2026-04-07T17:19:21.621235" elapsed="0.008040"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.632226" level="INFO">${json_data} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:21.631782" elapsed="0.000472"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:19:21.632303" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:21.632485" level="INFO">${resp_json} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:19:21.629478" elapsed="0.003034"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.632871" level="INFO">${topologies} = [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-ty...</msg>
<var>${topologies}</var>
<arg>${resp_json}</arg>
<arg>network-topology:topology</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.632663" elapsed="0.000235"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:19:21.633272" level="INFO">${topology} = {'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-typ...</msg>
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.633069" elapsed="0.000230"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.633644" level="INFO">${node_list} = [{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsd...</msg>
<var>${node_list}</var>
<arg>${topology}</arg>
<arg>node</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.633448" elapsed="0.000223"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.634103" level="INFO">[{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb:interface-type-tap'}, {'interface-type': 'ovsdb:interface-type-stt'}, {'interface-type': 'ovsdb:interface-type-internal'}, {'interface-type': 'ovsdb:interface-type-patch'}, {'interface-type': 'ovsdb:interface-type-lisp'}, {'interface-type': 'ovsdb:interface-type-geneve'}, {'interface-type': 'ovsdb:interface-type-gre'}, {'interface-type': 'ovsdb:interface-type-system'}], 'ovsdb:ovs-version': '2.17.11', 'ovsdb:connection-info': {'local-port': 6640, 'remote-port': 59846, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}, 'ovsdb:openvswitch-external-ids': [{'external-id-key': 'system-id', 'external-id-value': ''}, {'external-id-key': 'hostname', 'external-id-value': 'localhost'}, {'external-id-key': 'rundir', 'external-id-value': '/var/run/openvswitch'}], 'ovsdb:datapath-type-entry': [{'datapath-type': 'ovsdb:datapath-type-netdev'}, {'datapath-type': 'ovsdb:datapath-type-system'}], 'ovsdb:manager-entry': [{'target': 'tcp:10.30.171.205:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.175:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.206:6640', 'number_of_connections': 1, 'connected': True}]}]</msg>
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.633821" elapsed="0.000336"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.634698" level="INFO">${node_id} = ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${node_id}</var>
<arg>${node}</arg>
<arg>node-id</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.634526" elapsed="0.000198"/>
</kw>
<kw name="Replace String" owner="String">
<msg time="2026-04-07T17:19:21.636836" level="INFO">${node_uuid} = f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${node_uuid}</var>
<arg>${node_id}</arg>
<arg>ovsdb://uuid/</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.634872" elapsed="0.001991"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.637386" elapsed="0.000146"/>
</kw>
<msg time="2026-04-07T17:19:21.637627" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.637675" level="INFO">${connection_info} = {'local-port': 6640, 'remote-port': 59846, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}</msg>
<var>${status}</var>
<var>${connection_info}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.637047" elapsed="0.000651"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.638204" elapsed="0.000152"/>
</kw>
<msg time="2026-04-07T17:19:21.638449" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.638491" level="INFO">${remote_ip} = 10.30.171.56</msg>
<var>${status}</var>
<var>${remote_ip}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.637857" elapsed="0.000657"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.639098" level="INFO">${uuid} = f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${uuid}</var>
<arg>'${remote_ip}' == '${ovs_system_ip}'</arg>
<arg>${node_uuid}</arg>
<arg>${uuid}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:21.638696" elapsed="0.000428"/>
</kw>
<var name="${node}">{'node-id': 'ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb...</var>
<status status="PASS" start="2026-04-07T17:19:21.634398" elapsed="0.004766"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="PASS" start="2026-04-07T17:19:21.634212" elapsed="0.004984"/>
</for>
<return>
<value>${uuid}</value>
<status status="PASS" start="2026-04-07T17:19:21.639270" elapsed="0.000051"/>
</return>
<arg>controller_http_session=${session}</arg>
<doc>Queries the topology in the operational datastore and searches for the node that has
the ${ovs_system_ip} argument as the "remote-ip". If found, the value returned will be the value of
node-id stripped of "ovsdb://uuid/". If not found,  will be returned.</doc>
<status status="PASS" start="2026-04-07T17:19:21.608235" elapsed="0.031191"/>
</kw>
<msg time="2026-04-07T17:19:21.639507" level="INFO">${ovsdb_uuid} = f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${ovsdb_uuid}</var>
<arg>30s</arg>
<arg>2s</arg>
<arg>OVSDB.Get OVSDB UUID</arg>
<arg>controller_http_session=${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:19:21.601833" elapsed="0.037698"/>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="PASS" start="2026-04-07T17:19:21.639580" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:21.639728" level="INFO">${ovsdb_uuid} = f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${ovsdb_uuid}</var>
<doc>Connect OVS to the list of controllers in the ${controller_index_list} or all if no list is provided.</doc>
<status status="PASS" start="2026-04-07T17:19:17.575242" elapsed="4.064511"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.640260" level="INFO">${ovsdb_uuid} = f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>${ovsdb_uuid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-07T17:19:21.639933" elapsed="0.000368"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="PASS" start="2026-04-07T17:19:17.277061" elapsed="4.363350"/>
</test>
<test id="s1-s2-s1-t3" name="Check Entity Owner Status And Find Owner and Candidate Before Fail" line="26">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:21.643932" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:21.643672" 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-07T17:19:21.645212" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.645102" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.645074" 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-07T17:19:21.649802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.649695" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.649678" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.650851" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:21.650473" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.651370" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:21.651047" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:21.651440" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:21.651595" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:21.650104" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.656674" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.656567" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.656548" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.657949" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.657844" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.657826" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.658523" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.658174" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.658952" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:21.658700" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.694943" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:21.659542" elapsed="0.035584"/>
</kw>
<msg time="2026-04-07T17:19:21.695294" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:21.695369" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.659147" elapsed="0.036259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.774642" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:21.695989" elapsed="0.078905"/>
</kw>
<msg time="2026-04-07T17:19:21.775086" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:21.775133" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.695581" elapsed="0.079588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.775482" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.775246" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.775227" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.776118" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.775719" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.776483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.776273" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.776255" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:21.776616" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:21.778924" elapsed="0.000551"/>
</kw>
<kw name="Open 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-07T17:19:21.780421" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:21.781824" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:21.777469" elapsed="0.004765"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:21.776866" elapsed="0.005483"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:21.657544" elapsed="0.124906"/>
</kw>
<msg time="2026-04-07T17:19:21.782539" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.782582" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.656884" elapsed="0.125734"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:21.782802" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:21.782694" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.782676" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.783292" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.783654" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.783727" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:21.656231" elapsed="0.127603"/>
</kw>
<msg time="2026-04-07T17:19:21.783925" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.783993" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.651985" elapsed="0.132046"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.784351" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.784106" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.784089" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:21.651836" elapsed="0.132616"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.789640" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.789531" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.789512" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.790981" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.790857" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.790839" elapsed="0.000212"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.791576" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.791191" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.792030" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:21.791755" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.825848" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:21.792593" elapsed="0.033454"/>
</kw>
<msg time="2026-04-07T17:19:21.826236" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:21.826282" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.792213" elapsed="0.034104"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.904847" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:21.826879" elapsed="0.078185"/>
</kw>
<msg time="2026-04-07T17:19:21.905264" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:21.905309" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.826489" elapsed="0.078855"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.905636" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.905421" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.905401" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:21.906257" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:21.905873" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.906626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.906416" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.906397" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:21.906756" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:21.909235" elapsed="0.000515"/>
</kw>
<kw name="Open 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-07T17:19:21.910674" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:21.912114" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:21.907767" elapsed="0.004744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:21.907019" elapsed="0.005606"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:21.790551" elapsed="0.122174"/>
</kw>
<msg time="2026-04-07T17:19:21.912819" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.912862" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.789896" elapsed="0.123002"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:21.913113" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:21.913004" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.912957" elapsed="0.000277"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.913619" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.913944" elapsed="0.000120"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.914114" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:21.789181" elapsed="0.125048"/>
</kw>
<msg time="2026-04-07T17:19:21.914332" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:21.914383" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.784706" elapsed="0.129713"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:21.914742" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:21.914496" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.914478" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:21.784572" elapsed="0.130270"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.920024" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.919900" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.919881" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:21.921287" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:21.921179" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:21.921161" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:21.921850" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:21.921490" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.922296" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:21.922047" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:21.950039" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:21.922856" elapsed="0.027343"/>
</kw>
<msg time="2026-04-07T17:19:21.950372" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:21.950417" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.922478" elapsed="0.027974"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:22.026069" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:21.951058" elapsed="0.075215"/>
</kw>
<msg time="2026-04-07T17:19:22.026448" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:22.026495" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.950618" elapsed="0.075912"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.026835" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:22.026609" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:22.026589" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.027487" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:22.027096" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.027901" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:22.027682" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:22.027662" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:22.028054" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:22.030335" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:19:22.031789" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:22.033187" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:22.028880" elapsed="0.004697"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:22.028305" elapsed="0.005385"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:21.920852" elapsed="0.112938"/>
</kw>
<msg time="2026-04-07T17:19:22.033882" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:22.033925" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.920239" elapsed="0.113722"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:22.034170" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:22.034054" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:22.034035" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.034633" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.035172" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.035247" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:21.919561" elapsed="0.115794"/>
</kw>
<msg time="2026-04-07T17:19:22.035459" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:22.035502" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.915111" elapsed="0.120426"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.035854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:22.035611" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:22.035594" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:21.914960" elapsed="0.120994"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:21.651671" elapsed="0.384343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:21.649338" elapsed="0.386731"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:21.644789" elapsed="0.391336"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:21.644366" elapsed="0.391803"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:21.641458" elapsed="0.394764"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:19:22.069747" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:22.069365" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.070251" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:22.069929" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:22.070321" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:22.070517" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:22.068999" elapsed="0.001543"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:22.075048" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:22.074850" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:22.075473" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.075221" elapsed="0.000330">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.075713" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.075896" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076065" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076225" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076401" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076559" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076732" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.076887" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.086900" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.087109" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.096902" 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-07T17:19:22.097113" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.097179" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.074321" elapsed="0.022975">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:22.097407" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:22.097451" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:22.073751" elapsed="0.023722"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.097665" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:22.097554" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:22.097536" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:19:22.099032" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.099824" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:22.099423" elapsed="0.000428"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:22.100646" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:22.100388" elapsed="0.000283"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:22.100718" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:22.100866" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:22.100054" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.101481" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:22.101110" elapsed="0.000397"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.102019" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:22.101661" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:22.102439" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:22.114668" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:22.102203" elapsed="0.015493">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.118139" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.118522" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.118884" 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-07T17:19:22.119280" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.119865" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.120260" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.120833" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.121237" 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-07T17:19:22.121591" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:22.120559" elapsed="0.001169"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.120410" elapsed="0.001391"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.122208" elapsed="0.000059"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.122374" elapsed="0.000044"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.098481" elapsed="0.024183">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:22.122961" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:22.123114" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:22.097873" elapsed="0.025301"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:22.124729" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.124094" elapsed="0.000711">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:22.123398" elapsed="0.001476">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:22.123345" elapsed="0.001614">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.125043" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.073213" elapsed="0.051945">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.125378" 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-07T17:19:22.125567" elapsed="0.000026"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.125645" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:22.070838" elapsed="0.054919">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:22.125957" 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-07T17:19:22.126185" 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-07T17:19:22.126376" 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-07T17:19:22.126559" 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-07T17:19:22.126747" 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-07T17:19:22.126935" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:22.127024" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.068396" elapsed="0.058741">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:23.157664" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:23.157171" elapsed="0.000527"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:23.158218" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:23.157867" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:23.158295" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:23.158481" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:23.156762" 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-07T17:19:23.163086" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:23.162879" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:23.163501" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.163262" elapsed="0.000396">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.163844" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164070" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164229" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164390" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164571" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164731" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.164905" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.165077" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.174792" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.175001" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.186568" elapsed="0.000047"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.186847" elapsed="0.000029"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.186939" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.162344" elapsed="0.024850">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:23.187355" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:23.187421" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:23.161767" elapsed="0.025685"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.187772" elapsed="0.000027"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:23.187573" elapsed="0.000277"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:23.187545" elapsed="0.000345"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:19:23.189481" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:23.190182" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:23.189847" elapsed="0.000363"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:23.191177" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:23.190886" elapsed="0.000318"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:23.191252" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:23.191400" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:23.190395" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:23.191993" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:23.191582" elapsed="0.000438"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:23.192564" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:23.192212" elapsed="0.000378"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:23.192996" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:23.205052" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:23.192749" elapsed="0.014934">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.208007" 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-07T17:19:23.208248" 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-07T17:19:23.208474" 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-07T17:19:23.208698" 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-07T17:19:23.208930" 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-07T17:19:23.209188" 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-07T17:19:23.209570" 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-07T17:19:23.209803" 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-07T17:19:23.210045" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:23.209394" elapsed="0.000728"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.209291" elapsed="0.000871"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.210354" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.210436" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.188903" elapsed="0.021683">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:23.210744" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:23.210803" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:23.188254" elapsed="0.022581"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:23.211804" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.211268" elapsed="0.000624">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:23.210951" elapsed="0.001052">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:23.210925" elapsed="0.001126">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.212115" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.161212" elapsed="0.051038">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.212554" 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-07T17:19:23.212783" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.212869" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:23.158803" elapsed="0.054231">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.213265" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.213507" 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-07T17:19:23.213736" 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-07T17:19:23.213953" elapsed="0.000047"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:23.214200" 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-07T17:19:23.214424" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:23.214509" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:23.155997" elapsed="0.058648">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:24.246758" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:24.246224" elapsed="0.000571"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:24.247311" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:24.246987" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:24.247386" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:19:24.247580" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:24.245807" elapsed="0.001797"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:24.252539" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:24.252346" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:24.252959" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.252714" elapsed="0.000348">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.253224" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.253436" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.253591" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.253747" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.254019" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.254189" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.254362" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.254519" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.264281" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.264481" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.274260" 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-07T17:19:24.274454" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.274520" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.251770" elapsed="0.022870">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:24.274755" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:24.274798" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:24.251204" elapsed="0.023617"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.275052" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:24.274913" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:24.274891" 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-07T17:19:24.276516" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:24.277216" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:24.276882" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:24.278083" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:24.277786" elapsed="0.000326"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:24.278158" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:24.278312" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:24.277430" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:24.278859" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:24.278493" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:24.279397" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:24.279053" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:24.279813" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:24.294291" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:24.279577" elapsed="0.016489">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.296316" 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-07T17:19:24.296486" 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-07T17:19:24.296652" 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-07T17:19:24.296813" 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-07T17:19:24.296995" 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-07T17:19:24.297158" 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-07T17:19:24.297443" 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-07T17:19:24.297608" 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-07T17:19:24.297766" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:24.297316" elapsed="0.000502"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.297235" 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-07T17:19:24.298000" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.298061" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.275877" elapsed="0.022292">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:24.298281" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:24.298324" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:24.275267" elapsed="0.023081"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:24.298981" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.298647" elapsed="0.000394">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:24.298431" elapsed="0.000673">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:24.298412" elapsed="0.000724">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.299181" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.250637" elapsed="0.048642">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.299453" 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-07T17:19:24.299621" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.299682" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:24.247905" elapsed="0.051872">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:24.299992" 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-07T17:19:24.300170" 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-07T17:19:24.300351" 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-07T17:19:24.300508" 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-07T17:19:24.300672" 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-07T17:19:24.300831" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:24.300891" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:24.244982" elapsed="0.056022">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:25.332259" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:25.331725" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:25.332803" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:25.332472" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:25.332878" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:19:25.333082" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:25.331292" elapsed="0.001816"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:25.337825" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:25.337630" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:25.338472" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.338019" elapsed="0.000534">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.338719" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.338921" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339099" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339264" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339448" elapsed="0.000034"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339636" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339812" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.339973" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.350582" elapsed="0.000030"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.350848" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.360597" 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-07T17:19:25.360790" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.360857" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.337071" elapsed="0.023906">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:25.361133" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:25.361177" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:25.336488" elapsed="0.024712"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.361404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:25.361287" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:25.361267" 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-07T17:19:25.362777" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:25.363466" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:25.363156" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:25.364294" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:25.364030" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:25.364367" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:25.364515" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:25.363675" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:25.365079" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:25.364695" elapsed="0.000410"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:25.365616" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:25.365271" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:25.366049" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:25.378043" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:25.365803" elapsed="0.014695">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.380756" 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-07T17:19:25.381031" elapsed="0.000032"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.381262" 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-07T17:19:25.381488" 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-07T17:19:25.381728" 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-07T17:19:25.381998" 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-07T17:19:25.382460" 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-07T17:19:25.382695" 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-07T17:19:25.382919" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:25.382283" elapsed="0.000737"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.382180" elapsed="0.000883"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.383256" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.383340" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.362240" elapsed="0.021256">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:25.383664" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:25.383726" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:25.361618" elapsed="0.022141"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:25.387292" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.384203" elapsed="0.003179">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:25.383876" elapsed="0.003597">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:25.383850" elapsed="0.003670">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.387586" elapsed="0.000023"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.335879" elapsed="0.051848">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.387978" 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-07T17:19:25.388235" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.388323" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:25.333411" elapsed="0.055052">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.388692" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.388938" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.389205" 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-07T17:19:25.389434" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:25.389662" 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-07T17:19:25.389889" elapsed="0.000072"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:25.390048" elapsed="0.000023"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:25.330281" elapsed="0.059955">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:26.421117" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:26.420574" elapsed="0.000578"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:26.421639" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:26.421323" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:26.421714" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:19:26.421887" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:26.420186" 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-07T17:19:26.426595" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:26.426390" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:26.427020" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.426769" elapsed="0.000331">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.427273" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.427481" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.427638" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.427797" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.427980" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.428180" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.428360" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.428526" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.439555" elapsed="0.000178"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.439911" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.450085" 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-07T17:19:26.450327" elapsed="0.000028"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.450488" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.425822" elapsed="0.024799">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:26.450744" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:26.450788" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:26.425241" elapsed="0.025570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.451045" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:26.450901" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:26.450880" 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-07T17:19:26.452490" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:26.453201" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:26.452857" elapsed="0.000370"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:26.454125" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:26.453796" elapsed="0.000357"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:26.454201" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:26.454350" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:26.453414" elapsed="0.000960"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:26.454897" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:26.454532" elapsed="0.000538"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:26.455572" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:26.455228" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:26.455985" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:26.469061" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:26.455754" elapsed="0.016547">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.472707" 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-07T17:19:26.473118" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.473482" 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-07T17:19:26.473839" 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-07T17:19:26.474247" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.474605" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.475243" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.475616" 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-07T17:19:26.475972" elapsed="0.000071"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:26.474935" elapsed="0.001182"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.474780" elapsed="0.001396"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.476479" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.476610" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.451907" elapsed="0.025022">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:26.477220" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:26.477317" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:26.451278" elapsed="0.026090"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:26.478762" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.478055" elapsed="0.000893">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:26.477552" elapsed="0.001571">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:26.477512" elapsed="0.001685">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.479299" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.424638" elapsed="0.054878">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.479743" 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-07T17:19:26.479909" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.479973" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:26.422248" elapsed="0.057838">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:26.480251" 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-07T17:19:26.480422" 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-07T17:19:26.480585" 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-07T17:19:26.480740" 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-07T17:19:26.480902" 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-07T17:19:26.481075" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:26.481137" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:26.419422" elapsed="0.061812">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:27.510302" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:27.509809" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:27.510807" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:27.510496" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:27.510881" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:27.511080" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:27.509355" 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-07T17:19:27.515785" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:27.515597" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:27.516207" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.515958" elapsed="0.000321">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.516441" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.516642" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.516798" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.516960" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.517158" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.517319" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.517522" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.517682" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.527487" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.527680" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.537422" 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-07T17:19:27.537613" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.537678" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.515060" elapsed="0.022732">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:27.537904" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:27.537947" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:27.514383" elapsed="0.023590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.538252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:27.538097" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:27.538076" 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-07T17:19:27.539635" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:27.540327" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:27.540012" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:27.541318" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:27.540871" elapsed="0.000474"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:27.541392" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:27.541541" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:27.540538" elapsed="0.001027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:27.542131" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:27.541722" elapsed="0.000437"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:27.542663" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:27.542314" elapsed="0.000375"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:27.543094" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:27.557679" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:27.542849" elapsed="0.017592">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.560844" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.561262" elapsed="0.000052"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.561628" 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-07T17:19:27.562015" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.562391" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.562772" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.563397" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.563770" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.564149" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:27.563116" elapsed="0.001153"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.562925" elapsed="0.001404"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.564629" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.564759" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.539086" elapsed="0.025941">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:27.565282" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:27.565382" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:27.538469" elapsed="0.026964"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:27.566887" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.566400" elapsed="0.000548">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:27.565873" elapsed="0.001155">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:27.565821" elapsed="0.001241">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.567108" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.513816" elapsed="0.053392">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.567380" 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-07T17:19:27.567542" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.567603" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:27.511405" elapsed="0.056295">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:27.567861" 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-07T17:19:27.568050" 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-07T17:19:27.568218" 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-07T17:19:27.568375" 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-07T17:19:27.568539" 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-07T17:19:27.568699" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:27.568759" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:27.508614" elapsed="0.060243">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:28.598838" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:28.598306" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:28.599394" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:28.599068" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:28.599470" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:19:28.599660" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:28.597885" elapsed="0.001801"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:28.604744" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:28.604551" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:28.605181" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.604919" elapsed="0.000344">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.605428" elapsed="0.000043"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.605662" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.605817" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.605979" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.606172" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.606332" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.606505" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.606661" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.616489" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.616682" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.626433" 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-07T17:19:28.626624" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.626688" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.604009" elapsed="0.022799">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:28.627024" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:28.627069" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:28.603421" elapsed="0.023675"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.627309" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:28.627188" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:28.627167" 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-07T17:19:28.628701" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:28.629390" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:28.629075" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:28.630273" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:28.629962" elapsed="0.000341"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:28.630390" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:28.630541" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:28.629597" elapsed="0.000969"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:28.631115" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:28.630721" elapsed="0.000420"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:28.631644" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:28.631296" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:28.632083" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:28.645763" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:28.631827" elapsed="0.016493">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.648726" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.649149" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.649513" 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-07T17:19:28.649873" 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-07T17:19:28.650284" 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-07T17:19:28.650666" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.651292" 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-07T17:19:28.651661" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.652036" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:28.650985" elapsed="0.001172"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.650822" elapsed="0.001394"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.652517" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.652647" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.628162" elapsed="0.024723">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:28.653171" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:28.653271" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:28.627525" elapsed="0.025797"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:28.654853" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.653983" elapsed="0.001039">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:28.653505" elapsed="0.001671">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:28.653465" elapsed="0.001782">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.655347" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.602856" elapsed="0.052708">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.655859" 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-07T17:19:28.656049" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.656113" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:28.600111" elapsed="0.056102">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:28.656377" 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-07T17:19:28.656549" 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-07T17:19:28.656711" 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-07T17:19:28.656868" 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-07T17:19:28.657046" 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-07T17:19:28.657207" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:28.657267" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:28.597004" elapsed="0.060361">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:29.688784" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:29.688287" elapsed="0.000533"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:29.689333" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:29.689008" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:29.689407" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:19:29.689595" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:29.687874" 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-07T17:19:29.694283" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:29.694084" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:29.694706" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.694458" elapsed="0.000581">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.695208" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.695414" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.695569" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.695727" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.696029" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.696191" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.696364" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.696521" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.706243" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.706438" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.716955" elapsed="0.000046"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.717194" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.717269" elapsed="0.000025"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.693478" elapsed="0.023936">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:29.717557" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:29.717607" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:29.692896" elapsed="0.024739"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.717882" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:29.717747" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:29.717723" 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-07T17:19:29.720379" elapsed="0.000261"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:29.721161" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:29.720799" elapsed="0.000389"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:29.722017" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:29.721734" elapsed="0.000310"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:29.722091" elapsed="0.000037"/>
</return>
<msg time="2026-04-07T17:19:29.722251" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:29.721382" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:29.722840" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:29.722435" elapsed="0.000431"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:29.723383" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:29.723038" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:29.723810" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:29.736862" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:29.723565" elapsed="0.017645">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.741792" elapsed="0.000064"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.742251" elapsed="0.000051"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.742649" elapsed="0.000050"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.743147" elapsed="0.000056"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.743567" 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-07T17:19:29.743853" 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-07T17:19:29.744255" 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-07T17:19:29.744489" 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-07T17:19:29.744708" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:29.744080" elapsed="0.000701"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.743954" elapsed="0.000865"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.745029" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.745113" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.719017" elapsed="0.026252">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:29.745429" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:29.745490" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:29.718160" elapsed="0.027363"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:29.746759" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.746021" elapsed="0.000827">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:29.745651" elapsed="0.001284">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:29.745623" elapsed="0.001595">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.747339" elapsed="0.000029"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.692352" elapsed="0.055157">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.747774" 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-07T17:19:29.748023" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.748109" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:29.689938" elapsed="0.058307">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:29.748546" 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-07T17:19:29.748790" 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-07T17:19:29.749042" 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-07T17:19:29.749264" 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-07T17:19:29.749485" 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-07T17:19:29.749704" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:29.749788" elapsed="0.000023"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:29.687093" elapsed="0.062849">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:30.779604" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:30.779138" elapsed="0.000497"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:30.780135" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:30.779802" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:30.780207" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:30.780376" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:30.778704" 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-07T17:19:30.784973" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:30.784781" elapsed="0.000234"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:30.785395" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.785163" elapsed="0.000302">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.785627" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.785829" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786001" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786163" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786339" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786499" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786671" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.786827" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.796913" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.797194" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.807068" 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-07T17:19:30.807258" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.807324" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.784247" elapsed="0.023192">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:30.807549" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:30.807610" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:30.783673" elapsed="0.023959"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.807838" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:30.807723" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:30.807703" 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-07T17:19:30.809224" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:30.809886" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:30.809580" elapsed="0.000331"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:30.810704" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:30.810442" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:30.810776" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:30.810921" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:30.810109" elapsed="0.000836"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:30.811479" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:30.811117" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:30.812039" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:30.811678" elapsed="0.000387"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:30.812448" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:30.825048" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:30.812221" elapsed="0.015743">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.828394" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.828769" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.829162" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.829523" 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-07T17:19:30.829889" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.830282" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.830960" elapsed="0.000080"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.831375" 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-07T17:19:30.831727" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:30.830676" elapsed="0.001168"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.830519" elapsed="0.001384"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.832266" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.832402" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.808671" elapsed="0.023975">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:30.832900" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:30.833035" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:30.808069" elapsed="0.025023"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:30.834487" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.833745" elapsed="0.000875">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:30.833277" elapsed="0.001482">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:30.833236" elapsed="0.001595">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.834931" elapsed="0.000042"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.783126" elapsed="0.052065">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.835579" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.835942" elapsed="0.000078"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.836153" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:30.780699" elapsed="0.055683">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:30.836747" 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-07T17:19:30.836977" 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-07T17:19:30.837157" 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-07T17:19:30.837315" 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-07T17:19:30.837475" 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-07T17:19:30.837632" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:30.837727" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:30.777951" elapsed="0.059877">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:31.867158" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:31.866656" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:31.867670" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:31.867358" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:31.867742" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:19:31.867916" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:31.866274" 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-07T17:19:31.872491" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:31.872301" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:31.872900" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.872663" elapsed="0.000337">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.873165" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.873371" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.873525" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.873939" elapsed="0.000058"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.874191" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.874358" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.874532" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.874690" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.884758" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.884953" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.894730" 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-07T17:19:31.894921" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.895074" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.871753" elapsed="0.023444">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:31.895316" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:31.895359" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:31.871201" elapsed="0.024181"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.895584" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:31.895469" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:31.895449" 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-07T17:19:31.897021" elapsed="0.000232"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:31.897720" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:31.897406" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:31.898745" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:31.898473" elapsed="0.000298"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:31.898820" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:31.898980" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:31.897931" elapsed="0.001107"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:31.899569" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:31.899199" elapsed="0.000399"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:31.900116" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:31.899752" elapsed="0.000390"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:31.900533" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:31.913531" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:31.900301" elapsed="0.015318">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.915808" 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-07T17:19:31.915997" 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-07T17:19:31.916179" 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-07T17:19:31.916349" 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-07T17:19:31.916516" 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-07T17:19:31.916673" 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-07T17:19:31.916951" 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-07T17:19:31.917149" 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-07T17:19:31.917312" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:31.916825" elapsed="0.000540"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.916746" 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-07T17:19:31.917531" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.917590" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.896458" elapsed="0.021312">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:31.917893" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:31.917937" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:31.895803" elapsed="0.022160"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:31.918672" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.918307" elapsed="0.000426">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:31.918075" elapsed="0.000721">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:31.918052" elapsed="0.000777">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.918876" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.870638" elapsed="0.048339">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.919184" 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-07T17:19:31.919352" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.919415" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:31.868258" elapsed="0.051256">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:31.919679" 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-07T17:19:31.919854" 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-07T17:19:31.920037" 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-07T17:19:31.920207" 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-07T17:19:31.920374" 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-07T17:19:31.920533" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:31.920594" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:31.865490" elapsed="0.055202">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:32.951273" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:32.950744" elapsed="0.000563"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:32.951794" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:32.951476" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:32.951868" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:19:32.952063" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:32.950268" elapsed="0.001820"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:32.956868" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:32.956679" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:32.957295" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:32.957058" elapsed="0.000311">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.957530" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.957755" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.957912" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.958091" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.958268" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.958427" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.958598" elapsed="0.000065"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.958803" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.968548" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.968740" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:32.978392" 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-07T17:19:32.978582" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:32.978648" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:32.956146" elapsed="0.022618">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:32.978877" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:32.978920" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:32.955570" elapsed="0.023372"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:32.979204" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:32.979053" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:32.979032" 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-07T17:19:32.980580" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:32.981283" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:32.980936" elapsed="0.000373"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:32.982143" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:32.981821" elapsed="0.000351"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:32.982220" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:32.982368" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:32.981492" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:32.982910" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:32.982547" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:32.983448" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:32.983104" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:32.983856" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:32.998065" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:32.983629" elapsed="0.017056">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.000958" elapsed="0.000056"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.001232" 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-07T17:19:33.001467" 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-07T17:19:33.001704" 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-07T17:19:33.001948" elapsed="0.000052"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.002206" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.002617" 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-07T17:19:33.002862" 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-07T17:19:33.003120" elapsed="0.000031"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:33.002431" elapsed="0.000769"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:33.002308" elapsed="0.000933"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.003442" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:33.003528" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:32.980044" elapsed="0.023644">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:33.003856" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:33.003920" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:32.979419" elapsed="0.024536"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:33.005000" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:33.004477" elapsed="0.000613">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:33.004165" elapsed="0.001015">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:33.004136" elapsed="0.001090">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:33.005292" elapsed="0.000023"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:32.955025" elapsed="0.050409">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.005689" elapsed="0.000033"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.005930" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:33.006069" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:32.952388" elapsed="0.053827">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.006486" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.006745" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.006973" elapsed="0.000034"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:33.007145" 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-07T17:19:33.007306" 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-07T17:19:33.007464" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:33.007524" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:32.949414" elapsed="0.058206">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:34.039127" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:34.038605" elapsed="0.000557"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:34.039654" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:34.039335" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:34.039744" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:19:34.039928" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:34.038213" elapsed="0.001740"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:34.044641" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:34.044448" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:34.045069" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.044813" elapsed="0.000333">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.045541" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.045751" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.045909" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.046340" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.046535" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.046703" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.046876" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.047053" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.056867" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.057078" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.066930" 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-07T17:19:34.067148" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.067215" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.043889" elapsed="0.023445">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:34.067447" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:34.067491" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:34.043308" elapsed="0.024206"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.067717" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:34.067601" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:34.067580" 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-07T17:19:34.069147" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:34.069822" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:34.069511" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:34.070652" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:34.070387" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:34.070782" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:34.070934" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:34.070046" elapsed="0.000913"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:34.071508" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:34.071141" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:34.072054" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:34.071687" elapsed="0.000393"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:34.072490" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:34.084658" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:34.072261" elapsed="0.016314">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.089025" elapsed="0.000055"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.089413" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.089773" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.090169" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.090581" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.090938" elapsed="0.000074"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.091551" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.091919" elapsed="0.000051"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.092302" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:34.091275" elapsed="0.001194"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.091118" elapsed="0.001410"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.092829" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.092958" elapsed="0.000064"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.068595" elapsed="0.024552">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:34.093264" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:34.093308" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:34.067930" elapsed="0.025401"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:34.093951" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.093625" elapsed="0.000404">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:34.093413" elapsed="0.000681">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:34.093395" elapsed="0.000733">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.094174" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.042743" elapsed="0.051530">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.094501" 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-07T17:19:34.094665" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.094726" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:34.040370" elapsed="0.054455">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:34.095006" 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-07T17:19:34.095190" 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-07T17:19:34.095355" 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-07T17:19:34.095512" 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-07T17:19:34.095672" 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-07T17:19:34.095830" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:34.095891" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:34.037423" elapsed="0.058582">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:35.126030" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:35.125503" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:35.126569" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:35.126251" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:35.126643" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:35.126824" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:35.125096" elapsed="0.001752"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:35.131549" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:35.131356" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:35.131959" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.131723" elapsed="0.000356">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.132247" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.132448" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.132602" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.132761" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.133098" elapsed="0.000024"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.133274" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.133461" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.133630" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.143537" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.143729" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.153728" 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-07T17:19:35.153918" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.154001" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.130806" elapsed="0.023316">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:35.154234" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:35.154277" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:35.130246" elapsed="0.024053"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.154507" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:35.154389" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:35.154368" 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-07T17:19:35.155876" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:35.156601" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:35.156259" elapsed="0.000370"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:35.157599" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:35.157166" elapsed="0.000459"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:35.157674" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:35.157822" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:35.156810" elapsed="0.001037"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:35.158396" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:35.158020" elapsed="0.000402"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:35.158920" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:35.158576" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:35.159357" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:35.171233" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:35.159127" elapsed="0.014814">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.174474" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.174855" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.175268" elapsed="0.000048"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.175636" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.176044" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.176405" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.177062" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.177442" 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-07T17:19:35.177796" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:35.176747" elapsed="0.001166"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.176587" elapsed="0.001415"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.178425" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.178558" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.155340" elapsed="0.023463">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:35.179088" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:35.179189" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:35.154720" elapsed="0.024521"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:35.180722" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.179896" elapsed="0.000960">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:35.179426" elapsed="0.001604">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:35.179385" elapsed="0.001731">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.181233" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.129687" elapsed="0.051660">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.181518" 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-07T17:19:35.181682" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.181743" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:35.127166" elapsed="0.054676">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:35.182075" 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-07T17:19:35.182252" 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-07T17:19:35.182416" 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-07T17:19:35.182572" 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-07T17:19:35.182734" 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-07T17:19:35.182892" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:35.182953" elapsed="0.000018"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:35.124221" elapsed="0.058849">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:36.211569" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:36.211097" elapsed="0.000504"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:36.212096" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:36.211766" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:36.212169" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:19:36.212338" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:36.210697" 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-07T17:19:36.217259" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:36.217071" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:36.217668" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.217437" elapsed="0.000304">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.217901" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.218116" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.218270" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.218587" elapsed="0.000028"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.218791" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.218951" elapsed="0.000042"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.219147" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.219304" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.229043" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.229314" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.239178" 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-07T17:19:36.239369" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.239436" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.216513" elapsed="0.023038">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:36.239661" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:36.239704" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:36.215935" elapsed="0.023791"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.239926" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:36.239811" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:36.239792" 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-07T17:19:36.241362" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:36.242066" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:36.241723" elapsed="0.000369"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:36.242897" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:36.242615" elapsed="0.000308"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:36.242982" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:36.243132" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:36.242280" elapsed="0.000876"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:36.243675" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:36.243310" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:36.244215" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:36.243852" elapsed="0.000391"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:36.244628" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:36.256175" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:36.244399" elapsed="0.014466">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.259339" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.259721" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.260116" 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-07T17:19:36.260479" 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-07T17:19:36.260848" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.261239" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.261948" elapsed="0.000085"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.262368" 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-07T17:19:36.262717" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:36.261663" elapsed="0.001170"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.261506" elapsed="0.001384"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.263251" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.263384" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.240800" elapsed="0.022825">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:36.263881" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:36.264010" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:36.240157" elapsed="0.023910"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:36.265500" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.264737" elapsed="0.000896">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:36.264259" elapsed="0.001513">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:36.264218" elapsed="0.001625">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.265942" elapsed="0.000067"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.215391" elapsed="0.050808">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.266582" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.266942" elapsed="0.000076"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.267168" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:36.212657" elapsed="0.054733">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.267749" elapsed="0.000051"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:36.268170" 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-07T17:19:36.268339" 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-07T17:19:36.268496" 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-07T17:19:36.268657" 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-07T17:19:36.268815" elapsed="0.000077"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:36.268942" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:36.209951" elapsed="0.059108">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:37.300353" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:37.299785" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:37.300868" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:37.300554" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:37.300942" elapsed="0.000059"/>
</return>
<msg time="2026-04-07T17:19:37.301134" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:37.299388" elapsed="0.001771"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:37.305764" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:37.305576" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:37.306190" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.305937" elapsed="0.000543">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.306647" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.306846" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307020" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307182" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307360" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307518" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307690" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.307846" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.318374" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.318566" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.328505" 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-07T17:19:37.328697" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.328834" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.305039" elapsed="0.023914">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:37.329091" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:37.329134" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:37.304469" elapsed="0.024688"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.329367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:37.329247" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:37.329227" 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-07T17:19:37.330754" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:37.331443" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:37.331131" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:37.332288" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:37.331996" elapsed="0.000318"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:37.332361" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:37.332509" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:37.331650" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:37.333073" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:37.332690" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:37.333597" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:37.333256" elapsed="0.000366"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:37.334022" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:37.345733" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:37.333779" elapsed="0.015388">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.349576" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.349946" elapsed="0.000079"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.350345" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.350702" 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-07T17:19:37.351107" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.351462" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.352070" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.352464" 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-07T17:19:37.352811" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:37.351765" elapsed="0.001161"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.351610" elapsed="0.001406"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.353319" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.353450" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.330215" elapsed="0.023558">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:37.354065" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:37.354165" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:37.329581" elapsed="0.024636"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:37.355619" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.354874" elapsed="0.000878">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:37.354403" elapsed="0.001487">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:37.354362" elapsed="0.001599">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.356101" elapsed="0.000551"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.303893" elapsed="0.052969">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.357259" 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-07T17:19:37.357422" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.357482" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:37.301462" elapsed="0.056118">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:37.357742" 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-07T17:19:37.357912" 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-07T17:19:37.358092" 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-07T17:19:37.358248" 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-07T17:19:37.358406" 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-07T17:19:37.358562" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:37.358622" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:37.298580" elapsed="0.060140">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:38.386849" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:38.386366" elapsed="0.000516"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:38.387393" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:38.387075" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:38.387468" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:19:38.387641" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:38.385844" elapsed="0.001823"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:38.392261" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:38.392045" elapsed="0.000242"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:38.392666" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.392434" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.392901" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393118" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393273" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393431" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393606" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393765" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.393936" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.394109" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.403999" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.404212" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.413898" 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-07T17:19:38.414102" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.414168" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.391486" elapsed="0.022807">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:38.414423" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:38.414466" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:38.390913" elapsed="0.023575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.414725" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:38.414576" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:38.414556" 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-07T17:19:38.416116" elapsed="0.000237"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:38.416819" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:38.416509" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:38.417638" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:38.417377" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:38.417710" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:38.417856" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:38.417045" elapsed="0.000835"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:38.418415" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:38.418051" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:38.418932" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:38.418591" elapsed="0.000377"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:38.419384" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:38.431484" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:38.419160" elapsed="0.014730">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.434167" 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-07T17:19:38.434402" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.434627" 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-07T17:19:38.434853" 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-07T17:19:38.435104" 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-07T17:19:38.435326" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.435692" 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-07T17:19:38.435923" 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-07T17:19:38.436168" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:38.435519" elapsed="0.000722"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.435421" elapsed="0.000857"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.436501" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.436584" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.415562" elapsed="0.021171">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:38.436897" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:38.436958" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:38.414944" elapsed="0.022072"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:38.437969" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.437502" elapsed="0.000575">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:38.437189" elapsed="0.000979">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:38.437163" elapsed="0.001052">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.438282" elapsed="0.000025"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.390368" elapsed="0.048059">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.438666" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.438891" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.438997" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:38.388002" elapsed="0.051133">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.439360" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.439599" 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-07T17:19:38.439828" 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-07T17:19:38.440068" elapsed="0.000030"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.440297" elapsed="0.000039"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:38.440533" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:38.440619" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:38.385094" elapsed="0.055660">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:39.471553" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:39.471050" elapsed="0.000535"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:39.472155" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:39.471773" elapsed="0.000411"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:39.472237" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:19:39.472431" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:39.470644" elapsed="0.001815"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:39.477933" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:39.477727" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:39.478410" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.478141" elapsed="0.000348">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.478652" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.478854" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479027" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479215" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479399" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479558" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479729" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.479883" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.489824" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.490039" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.499940" elapsed="0.000041"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.500150" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.500216" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.477096" elapsed="0.023240">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:39.500448" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:39.500491" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:39.476439" elapsed="0.024075"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.500723" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:39.500603" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:39.500583" 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-07T17:19:39.502118" elapsed="0.000219"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:39.502808" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:39.502496" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:39.503820" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:39.503551" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:39.503940" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:19:39.504112" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:39.503032" elapsed="0.001105"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:39.504663" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:39.504294" elapsed="0.000395"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:39.505199" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:39.504839" elapsed="0.000387"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:39.505612" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:39.517519" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:39.505388" elapsed="0.015221">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.521044" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.521429" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.521813" 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-07T17:19:39.522231" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.522629" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.523050" elapsed="0.000053"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.523731" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.524170" elapsed="0.000049"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.524530" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:39.523413" elapsed="0.001231"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.523217" elapsed="0.001484"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.525026" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.525164" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.501566" elapsed="0.023840">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:39.525652" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:39.525748" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:39.500934" elapsed="0.024865"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:39.527300" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.526497" elapsed="0.000996">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:39.526009" elapsed="0.001635">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:39.525938" elapsed="0.001781">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.527825" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.475762" elapsed="0.052335">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.528440" 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-07T17:19:39.528602" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.528662" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:39.472904" elapsed="0.055855">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:39.528923" 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-07T17:19:39.529117" 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-07T17:19:39.529283" 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-07T17:19:39.529440" 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-07T17:19:39.529600" 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-07T17:19:39.529758" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:39.529819" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:39.469916" elapsed="0.060000">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:40.561449" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:40.560950" elapsed="0.000531"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:40.561957" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:40.561647" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:40.562052" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:19:40.562225" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:40.560567" 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-07T17:19:40.567202" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:40.566867" elapsed="0.000365"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:40.567625" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.567386" elapsed="0.000310">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.567860" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.568089" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.568247" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.568410" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.568655" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.568815" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.569006" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.569167" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.578956" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.579163" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.588877" 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-07T17:19:40.589085" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.589152" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.566319" elapsed="0.022947">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:40.589379" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:40.589424" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:40.565735" elapsed="0.023712"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.589689" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:40.589560" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:40.589540" 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-07T17:19:40.591070" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:40.591733" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:40.591427" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:40.592547" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:40.592289" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:40.592621" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:40.592768" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:40.591940" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:40.593326" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:40.592946" elapsed="0.000405"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:40.593887" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:40.593536" elapsed="0.000377"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:40.594317" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:40.609023" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:40.594084" elapsed="0.018377">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.612953" elapsed="0.000087"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.613371" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.613748" 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-07T17:19:40.614150" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.614525" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.614877" 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-07T17:19:40.615494" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.615866" 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-07T17:19:40.616251" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:40.615215" elapsed="0.001157"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.615059" elapsed="0.001372"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.616732" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.616862" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.590517" elapsed="0.026620">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:40.617393" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:40.617491" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:40.589898" elapsed="0.027644"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:40.618675" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.618281" elapsed="0.000454">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:40.617775" elapsed="0.001021">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:40.617733" elapsed="0.001096">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.618873" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.565167" elapsed="0.053818">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.619159" 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-07T17:19:40.619322" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.619383" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:40.562541" elapsed="0.056939">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:40.619675" 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-07T17:19:40.619850" 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-07T17:19:40.620032" 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-07T17:19:40.620195" 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-07T17:19:40.620356" 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-07T17:19:40.620519" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:40.620579" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:40.559808" elapsed="0.060868">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:41.650878" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:41.650402" elapsed="0.000507"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:41.651411" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:41.651095" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:41.651489" elapsed="0.000036"/>
</return>
<msg time="2026-04-07T17:19:41.651656" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:41.650017" 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-07T17:19:41.656233" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:41.656044" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:41.656633" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.656405" elapsed="0.000297">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657082" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657290" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657446" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657607" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657784" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.657945" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.658137" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.658294" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.668241" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.668494" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.678316" 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-07T17:19:41.678507" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.678574" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.655496" elapsed="0.023191">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:41.678799" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:41.678842" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:41.654922" elapsed="0.023942"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.679095" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:41.678952" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:41.678930" 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-07T17:19:41.680463" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:41.681153" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:41.680825" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:41.681958" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:41.681694" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:41.682050" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:41.682199" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:41.681360" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:41.682742" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:41.682379" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:41.683304" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:41.682921" elapsed="0.000408"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:41.683716" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:41.697846" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:41.683484" elapsed="0.018291">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.702217" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.702598" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.702954" elapsed="0.000084"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.703479" 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-07T17:19:41.703720" 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-07T17:19:41.703940" 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-07T17:19:41.704430" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.704663" 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-07T17:19:41.704879" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:41.704254" elapsed="0.000698"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.704152" 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-07T17:19:41.705202" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.705285" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.679905" elapsed="0.025533">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:41.705598" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:41.705658" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:41.679305" elapsed="0.026386"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:41.706565" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.706120" elapsed="0.000527">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:41.705804" elapsed="0.000928">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:41.705779" elapsed="0.000998">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.706839" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.654362" elapsed="0.052633">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.707274" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.707502" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.707587" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:41.651993" elapsed="0.055731">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.707948" elapsed="0.000050"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.708214" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:41.708444" 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-07T17:19:41.708663" 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-07T17:19:41.708886" 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-07T17:19:41.709128" elapsed="0.000072"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:41.709262" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:41.649311" elapsed="0.060089">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:19:42.739706" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:42.739247" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.740225" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:42.739897" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:42.740297" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:19:42.740463" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:42.738857" elapsed="0.001631"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:19:42.745075" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:19:42.744874" elapsed="0.000229"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:19:42.745473" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.745248" elapsed="0.000291">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.745700" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.745894" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746069" elapsed="0.000022"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746231" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746417" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746578" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746752" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.746912" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.756861" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.757070" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.766944" elapsed="0.000041"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.767151" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.767394" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.744332" elapsed="0.023181">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:19:42.767624" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:42.767670" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.743759" elapsed="0.023936"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.767914" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.767797" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.767761" 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-07T17:19:42.769300" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.769963" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:19:42.769658" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:42.770949" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:42.770523" elapsed="0.000470"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:19:42.771043" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:42.771194" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:42.770193" elapsed="0.001026"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.771743" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:42.771375" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.772308" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:19:42.771947" elapsed="0.000387"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:19:42.772712" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:19:42.783386" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:19:42.772491" elapsed="0.014764">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.787663" elapsed="0.000067"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.788108" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.788474" 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-07T17:19:42.788836" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.789256" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.789613" 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-07T17:19:42.790218" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.790593" 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-07T17:19:42.790945" elapsed="0.000076"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:19:42.789911" elapsed="0.001184"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.789759" elapsed="0.001396"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.791458" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.791589" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.768747" elapsed="0.023210">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:19:42.792247" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:19:42.792346" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.768151" elapsed="0.024248"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.793083" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.792741" elapsed="0.000402">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:42.792530" elapsed="0.000676">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:19:42.792512" elapsed="0.000727">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.793285" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.743169" elapsed="0.050216">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.793558" 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-07T17:19:42.793737" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.793801" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:19:42.740781" elapsed="0.053120">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.794083" 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-07T17:19:42.794258" 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-07T17:19:42.794425" 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-07T17:19:42.794583" 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-07T17:19:42.794744" 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-07T17:19:42.794903" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.794982" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:19:42.738189" elapsed="0.056896">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<msg time="2026-04-07T17:19:42.795185" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.045893" elapsed="20.749415">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.795385" elapsed="0.000016"/>
</return>
<var>${original_owner}</var>
<var>${original_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:19:22.043782" elapsed="20.751705">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_candidate}</var>
<arg>${original_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.795657" 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-07T17:19:42.795836" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.796032" elapsed="0.000021"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.796200" elapsed="0.000019"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:19:21.640820" elapsed="21.155553">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</test>
<test id="s1-s2-s1-t4" name="Create Bridge Manually and Verify Before Fail" line="36">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:42.800283" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:42.800026" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.801509" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.801400" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.801383" 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-07T17:19:42.806357" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.806250" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.806232" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.807426" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:42.807046" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.807905" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:42.807604" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:42.808015" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:42.808172" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:42.806644" elapsed="0.001554"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.813293" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.813185" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.813165" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.814592" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.814487" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.814469" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:42.815172" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:42.814796" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:42.815618" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:42.815353" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:42.845071" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:42.816218" elapsed="0.029045"/>
</kw>
<msg time="2026-04-07T17:19:42.845500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:42.845548" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.815796" elapsed="0.029790"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:42.905677" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:42.846214" elapsed="0.059654"/>
</kw>
<msg time="2026-04-07T17:19:42.906058" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:42.906104" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.845771" elapsed="0.060370"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.906464" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:42.906228" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.906204" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:42.907109" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:42.906714" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.907478" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:42.907266" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.907248" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:42.907611" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:42.909979" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:19:42.911421" elapsed="0.000654"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:42.913017" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:42.908510" elapsed="0.004902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:42.907894" elapsed="0.005630"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:42.814186" elapsed="0.099437"/>
</kw>
<msg time="2026-04-07T17:19:42.913714" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:42.913757" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.813504" elapsed="0.100290"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:42.913994" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:42.913870" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.913851" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.914477" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.914813" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.914884" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:42.812834" elapsed="0.102187"/>
</kw>
<msg time="2026-04-07T17:19:42.915114" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:42.915157" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.808554" elapsed="0.106639"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:42.915553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:42.915305" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.915286" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:42.808421" elapsed="0.107232"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.920890" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.920783" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.920764" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:42.922158" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:42.922049" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:42.922031" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:42.922715" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:42.922363" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:42.923257" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:42.922891" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:42.955540" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:42.923813" elapsed="0.031886"/>
</kw>
<msg time="2026-04-07T17:19:42.955897" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:42.955945" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.923437" elapsed="0.032606"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.030592" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:42.956621" elapsed="0.074165"/>
</kw>
<msg time="2026-04-07T17:19:43.030954" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:43.031026" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.956212" elapsed="0.074852"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.031366" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.031143" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.031122" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.031993" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.031606" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.032356" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.032147" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.032129" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:43.032489" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.034775" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:19:43.036211" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:43.037596" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.033352" elapsed="0.004648"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:43.032751" elapsed="0.005363"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:42.921732" elapsed="0.116525"/>
</kw>
<msg time="2026-04-07T17:19:43.038351" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:43.038396" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.921122" elapsed="0.117312"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:43.038617" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.038511" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.038492" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.039105" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.039631" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.039705" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:42.920410" elapsed="0.119406"/>
</kw>
<msg time="2026-04-07T17:19:43.039910" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:43.039954" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.915917" elapsed="0.124102"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.040345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.040097" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.040079" elapsed="0.000346"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:42.915779" elapsed="0.124670"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.045689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.045581" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.045562" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.046939" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.046832" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.046814" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:43.047514" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.047163" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.047941" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:43.047693" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.079833" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:43.048533" elapsed="0.031477"/>
</kw>
<msg time="2026-04-07T17:19:43.080182" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:43.080228" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.048155" elapsed="0.032108"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.155652" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:43.080814" elapsed="0.075039"/>
</kw>
<msg time="2026-04-07T17:19:43.156042" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:43.156088" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.080430" elapsed="0.075694"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.156445" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.156212" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.156187" elapsed="0.000419"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.157173" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.156747" elapsed="0.000517"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.157567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.157331" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.157313" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:43.157701" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.160045" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:19:43.161480" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:43.163021" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.158587" elapsed="0.004823"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:43.158002" elapsed="0.005521"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:43.046531" elapsed="0.117093"/>
</kw>
<msg time="2026-04-07T17:19:43.163715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:43.163759" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.045902" elapsed="0.117895"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:43.164005" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.163873" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.163855" elapsed="0.000236"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.164481" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.164806" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.164875" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:43.045242" elapsed="0.119758"/>
</kw>
<msg time="2026-04-07T17:19:43.165094" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:43.165138" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.040710" elapsed="0.124464"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.165512" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.165249" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.165232" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:43.040573" elapsed="0.125041"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:42.808253" elapsed="0.357394"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:42.805862" elapsed="0.359845"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:42.801118" elapsed="0.364649"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:42.800686" elapsed="0.365128"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:42.797656" elapsed="0.368215"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:19:43.174300" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.174038" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.174019" elapsed="0.000361"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.174699" 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-07T17:19:43.174802" 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-07T17:19:43.174528" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.175372" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:19:43.174990" elapsed="0.000427"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.175935" level="INFO">${conn_id} = 421</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-07T17:19:43.175567" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.176869" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:43.176945" 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-07T17:19:43.176580" elapsed="0.000404"/>
</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-07T17:19:43.177140" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.178321" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:43.499503" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:21 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:43.178003" elapsed="0.321674"/>
</kw>
<msg time="2026-04-07T17:19:43.499757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.177637" elapsed="0.322199"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:43.176191" elapsed="0.323743"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.500382" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:19:43.593412" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:43.593661" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:43.593757" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:43.500168" elapsed="0.093639"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:43.594204" elapsed="0.000818"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.596076" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.595448" elapsed="0.000722"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.596588" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.596330" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.596284" elapsed="0.000453"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:43.597113" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.596852" elapsed="0.000391"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.596819" elapsed="0.000476"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.597369" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.603066" elapsed="0.000714"/>
</kw>
<kw name="Open 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-07T17:19:43.603940" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:43.604250" elapsed="0.000095"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.598062" elapsed="0.006333"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:43.173362" elapsed="0.431197"/>
</kw>
<msg time="2026-04-07T17:19:43.604612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.172795" elapsed="0.431865"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:43.172308" elapsed="0.432429"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.605267" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.604918" elapsed="0.000375"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.605758" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.605465" elapsed="0.000319"/>
</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-07T17:19:43.615345" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:43.614933" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.615833" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:43.615527" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:43.615902" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:43.616071" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.614569" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.621372" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.621074" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.621443" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:43.621587" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.620717" elapsed="0.000895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.628144" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.627862" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.628579" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.628339" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.637775" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.637964" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.638152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.630587" elapsed="0.007602"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.628697" elapsed="0.009552"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.638497" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.638285" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.628678" elapsed="0.009938"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.643122" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.640061" elapsed="0.003126"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.639735" elapsed="0.003498"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.639709" elapsed="0.003573"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.646692" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.643723" elapsed="0.003033"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.643359" elapsed="0.003444"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.643336" elapsed="0.003502"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.647680" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.647081" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.648041" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.647793" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.648577" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.648279" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.648124" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.647775" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.649187" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.648810" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.649507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.649282" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.650050" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.649740" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.649587" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.649264" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.650275" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.651091" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.650778" elapsed="0.000339"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.651280" elapsed="0.002133"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.639129" elapsed="0.014345"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.653653" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.653543" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.653525" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.653880" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.653950" elapsed="0.000018"/>
</return>
<msg time="2026-04-07T17:19:43.656099" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.621936" elapsed="0.034191"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.656178" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.656325" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:43.620238" elapsed="0.036111"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.657502" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.657124" elapsed="0.000445"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.656959" elapsed="0.000649"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.656831" elapsed="0.000806"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.656573" elapsed="0.001116"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:43.616302" elapsed="0.041421"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.663054" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.662741" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.663159" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:43.663310" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.662403" elapsed="0.000953"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.669414" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.669167" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.669844" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.669606" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.685845" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.685946" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.686059" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.671861" elapsed="0.014225"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.669953" elapsed="0.016175"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.686301" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.686153" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.669935" elapsed="0.016451"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.693374" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.688392" elapsed="0.005085"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.687889" elapsed="0.005665"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.687849" elapsed="0.005760"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.697749" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.694242" elapsed="0.003552"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.693728" elapsed="0.004100"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.693692" elapsed="0.004160"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.698386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.698022" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.698708" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.698481" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.699254" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.698940" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.698787" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.698464" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.699852" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.699497" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.700191" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.699947" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.700717" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.700423" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.700271" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.699929" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.700941" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.701722" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.701454" elapsed="0.000293"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.701894" elapsed="0.002290"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.686906" elapsed="0.017339"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.704461" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.704355" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.704336" elapsed="0.000209"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.704685" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.704755" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:43.706854" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.663678" elapsed="0.043203"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.706931" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.707096" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:43.661906" elapsed="0.045215"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.708270" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.707885" elapsed="0.000449"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.707740" elapsed="0.000633"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.707610" elapsed="0.000792"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.707338" elapsed="0.001115"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:43.657808" elapsed="0.050678"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.713626" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.713332" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.713697" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.713842" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.712992" elapsed="0.000874"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.719985" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.719727" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.720418" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.720179" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.737002" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.737104" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.737195" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.722403" elapsed="0.014817"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.720526" elapsed="0.016735"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.737434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.737286" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.720508" elapsed="0.017016"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.748223" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.739715" elapsed="0.008613"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.739221" elapsed="0.009185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.739181" elapsed="0.009282"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.751025" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.748894" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.748599" elapsed="0.002507"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.748556" elapsed="0.002575"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.751671" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.751284" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.752052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.751805" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.752583" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.752287" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.752134" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.751786" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.753189" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.752816" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.753512" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.753286" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.754054" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.753747" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.753593" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.753268" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.754280" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.755067" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.754782" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.755241" elapsed="0.002130"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.738269" elapsed="0.019164"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.757611" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.757502" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.757484" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.757837" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.757906" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:43.760046" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.714200" elapsed="0.045874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.760125" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.760272" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:43.712499" elapsed="0.047798"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.761437" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.761069" elapsed="0.000432"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.760904" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.760775" elapsed="0.000795"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.760514" elapsed="0.001107"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:43.708571" elapsed="0.053084"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:43.616155" elapsed="0.145527"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.614013" elapsed="0.147716"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:19:43.605963" elapsed="0.155817"/>
</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-07T17:19:43.771315" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:43.770923" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.771867" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:43.771533" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:43.771937" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:19:43.772107" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.770559" elapsed="0.001573"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.777346" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.777052" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.777418" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.777564" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.776698" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.783894" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.783633" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.784345" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.784103" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.793275" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.794775" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.794886" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.786353" elapsed="0.008559"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.784455" elapsed="0.010498"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.795147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.794996" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.784436" elapsed="0.010796"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.799301" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.796245" elapsed="0.003196"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.796029" elapsed="0.003462"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.796010" elapsed="0.003516"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.802866" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.799925" elapsed="0.003004"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.799602" elapsed="0.003395"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.799579" elapsed="0.003454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.803761" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.803248" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.804277" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.803930" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.804991" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.804632" elapsed="0.000386"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.804391" elapsed="0.000662"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.803903" elapsed="0.001172"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.805590" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.805229" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.805910" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.805684" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.806457" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.806164" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.806009" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.805666" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.806682" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.807471" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.807201" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.807643" elapsed="0.002126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.795567" elapsed="0.014263"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.810019" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.809898" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.809880" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.810244" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.810312" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:43.812540" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.777904" elapsed="0.034664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.812618" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.812765" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:43.776221" elapsed="0.036570"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.813932" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.813565" elapsed="0.000461"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.813417" elapsed="0.000648"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.813288" elapsed="0.000807"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.813025" elapsed="0.001121"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:43.772312" elapsed="0.041902"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.819870" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.819569" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.819997" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:43.820149" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.819222" elapsed="0.000952"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.826290" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.826041" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.826725" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.826483" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.838829" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.841272" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.841518" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.828760" elapsed="0.012815"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.826835" elapsed="0.014832"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.842086" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.841725" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.826817" elapsed="0.015460"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.849212" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.844537" elapsed="0.004768"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.844056" elapsed="0.005284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.844013" elapsed="0.005352"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.851751" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.849636" elapsed="0.002160"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.849419" elapsed="0.002411"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.849402" elapsed="0.002452"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.852413" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.852035" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.852743" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.852511" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.853294" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.852994" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.852824" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.852492" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.853889" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.853530" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.854230" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.854001" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.854751" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.854461" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.854309" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.853981" elapsed="0.000852"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.854993" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.855768" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.855494" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.855941" elapsed="0.002272"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.843063" elapsed="0.015213"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.858449" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.858345" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.858326" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.858674" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.858743" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:19:43.860991" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.820495" elapsed="0.040526"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.861071" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:43.861220" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:43.818663" elapsed="0.042583"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.862401" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.862030" elapsed="0.000448"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.861866" elapsed="0.000651"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.861736" elapsed="0.000811"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.861474" elapsed="0.001125"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:43.814306" elapsed="0.048362"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.867863" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.867565" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:43.867935" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:43.868112" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:43.867224" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.874238" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.873993" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.874670" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.874431" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:43.889005" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:43.889257" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:43.889408" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:43.876670" elapsed="0.012774"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.874780" elapsed="0.014723"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.889745" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.889539" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.874761" elapsed="0.015101"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.896040" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.891266" elapsed="0.005000"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.890940" elapsed="0.005405"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.890915" elapsed="0.005485"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.901265" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:43.897040" elapsed="0.004270"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.896523" elapsed="0.004821"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.896485" elapsed="0.004884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.901892" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.901524" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.902239" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.902006" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.902776" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.902474" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.902320" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.901987" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.903391" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.903028" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.903716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:43.903487" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.904273" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:43.903950" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:43.903797" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.903469" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:43.904499" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:43.905289" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:43.905016" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.905462" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:43.890361" elapsed="0.017274"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:43.907808" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:43.907704" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.907685" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:43.908051" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.908123" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:43.910352" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:43.868458" elapsed="0.041922"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:43.910430" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:43.910579" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:43.866723" elapsed="0.043882"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.911747" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:43.911374" elapsed="0.000449"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:43.911228" elapsed="0.000635"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:43.911099" elapsed="0.000793"/>
</for>
<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="PASS" start="2026-04-07T17:19:43.910822" elapsed="0.001121"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:43.862760" elapsed="0.049274"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:43.772181" elapsed="0.139886"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.770002" elapsed="0.142116"/>
</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_operational}</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-07T17:19:43.761967" elapsed="0.150337"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.170285" elapsed="0.742090"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:19:42.796955" elapsed="1.115544"/>
</test>
<test id="s1-s2-s1-t5" name="Add Port Manually and Verify Before Fail" line="40">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:43.916012" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:43.915739" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.917273" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.917164" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.917146" 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-07T17:19:43.922032" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.921910" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.921892" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.923080" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:43.922687" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:43.923563" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:43.923260" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:43.923633" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:43.923783" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:43.922316" elapsed="0.001492"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.928846" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.928739" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.928721" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:43.930129" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:43.930023" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:43.930004" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:43.930685" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:43.930332" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.931144" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:43.930863" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:43.961510" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:43.931701" elapsed="0.029967"/>
</kw>
<msg time="2026-04-07T17:19:43.961853" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:43.961898" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.931323" elapsed="0.030612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.019686" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:43.962506" elapsed="0.057388"/>
</kw>
<msg time="2026-04-07T17:19:44.020098" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:44.020200" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.962117" elapsed="0.058124"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.020554" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.020324" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.020303" elapsed="0.000384"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.021221" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.020828" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.021584" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.021373" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.021355" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:44.021716" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.024003" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:19:44.025444" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:44.026818" elapsed="0.000480"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.022553" elapsed="0.004816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:44.021982" elapsed="0.005502"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:43.929703" elapsed="0.097880"/>
</kw>
<msg time="2026-04-07T17:19:44.027674" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.027717" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.929071" elapsed="0.098683"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:44.027937" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.027832" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.027813" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.028432" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.028829" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.028901" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:43.928411" elapsed="0.100641"/>
</kw>
<msg time="2026-04-07T17:19:44.029143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.029186" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.924173" elapsed="0.105049"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.029539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.029297" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.029280" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:43.924037" elapsed="0.105601"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.034862" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.034757" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.034738" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.036129" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.036020" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.036001" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:44.036763" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.036379" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.037213" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:44.036944" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.070428" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:44.037774" elapsed="0.032824"/>
</kw>
<msg time="2026-04-07T17:19:44.070765" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:44.070811" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.037393" elapsed="0.033456"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.130707" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:44.071425" elapsed="0.059474"/>
</kw>
<msg time="2026-04-07T17:19:44.131091" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:44.131137" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.071036" elapsed="0.060138"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.131474" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.131251" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.131231" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.132110" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.131712" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.132468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.132260" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.132242" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:44.132603" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.134887" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:19:44.136351" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:44.137751" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.133457" elapsed="0.004698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:44.132848" elapsed="0.005420"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:44.035697" elapsed="0.102671"/>
</kw>
<msg time="2026-04-07T17:19:44.138458" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.138501" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.035089" elapsed="0.103452"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:44.138723" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.138618" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.138600" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.139204" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.139752" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.139826" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:44.034424" elapsed="0.105519"/>
</kw>
<msg time="2026-04-07T17:19:44.140068" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.140111" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.029893" elapsed="0.110254"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.140468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.140223" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.140205" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:44.029757" elapsed="0.110811"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.146010" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.145887" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.145868" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.147255" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.147149" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.147131" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:44.147805" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.147457" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.148249" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:44.148003" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.177608" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:44.148803" elapsed="0.028991"/>
</kw>
<msg time="2026-04-07T17:19:44.178035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:44.178084" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.148428" elapsed="0.029692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.234034" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:44.178685" elapsed="0.055535"/>
</kw>
<msg time="2026-04-07T17:19:44.234385" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:44.234429" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.178294" elapsed="0.056171"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.234757" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.234540" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.234520" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.235378" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.235014" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.235736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.235527" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.235510" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:44.235865" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.238209" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.239612" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:44.240960" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.236743" elapsed="0.004631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:44.236175" elapsed="0.005331"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:44.146824" elapsed="0.094781"/>
</kw>
<msg time="2026-04-07T17:19:44.241695" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.241738" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.146221" elapsed="0.095554"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:44.241954" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.241849" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.241831" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.242428" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.242748" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.242817" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:44.145553" elapsed="0.097369"/>
</kw>
<msg time="2026-04-07T17:19:44.243087" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:44.243131" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.140820" elapsed="0.102348"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.243484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.243243" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.243226" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:44.140687" elapsed="0.102896"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:43.923857" elapsed="0.319754"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:43.921550" elapsed="0.322113"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:43.916861" elapsed="0.326857"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:43.916441" elapsed="0.327320"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:43.913756" elapsed="0.330076"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:19:44.252147" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.251869" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.251851" elapsed="0.000376"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.252509" 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-07T17:19:44.252612" 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-07T17:19:44.252368" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.253180" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:19:44.252785" elapsed="0.000483"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.253814" level="INFO">${conn_id} = 426</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-07T17:19:44.253422" elapsed="0.000417"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.254723" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:44.254798" 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-07T17:19:44.254458" elapsed="0.000363"/>
</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-07T17:19:44.254988" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.256142" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:44.573547" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:43 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:44.255813" elapsed="0.317820"/>
</kw>
<msg time="2026-04-07T17:19:44.573697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.255466" elapsed="0.318286"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:44.254069" elapsed="0.319770"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.574212" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:19:44.627021" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:44.627257" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:44.627353" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:44.574032" elapsed="0.053375"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:44.627759" elapsed="0.000827"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.629567" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.628957" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.630110" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.629823" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.629779" elapsed="0.000484"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:44.630607" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.630377" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.630344" elapsed="0.000473"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.630892" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.636280" elapsed="0.000427"/>
</kw>
<kw name="Open 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-07T17:19:44.636927" elapsed="0.000227"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:44.637356" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.631572" elapsed="0.005989"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:44.251353" elapsed="0.386332"/>
</kw>
<msg time="2026-04-07T17:19:44.637757" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.250791" elapsed="0.387030"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:44.250299" elapsed="0.387718"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.638704" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.638267" elapsed="0.000474"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.639430" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.639022" elapsed="0.000444"/>
</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-07T17:19:44.650270" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:44.649874" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.650749" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:44.650450" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:44.650845" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:19:44.651016" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.649509" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.656255" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.655945" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.656326" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.656469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.655609" elapsed="0.000883"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.662739" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.662492" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.663201" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.662945" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.672829" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.673016" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.673150" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.665185" elapsed="0.008002"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.663309" elapsed="0.009935"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.673486" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.673280" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.663290" elapsed="0.010313"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.678151" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.675053" elapsed="0.003162"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.674708" elapsed="0.003555"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.674683" elapsed="0.003615"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.681602" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.678671" elapsed="0.002992"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.678374" elapsed="0.003336"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.678351" elapsed="0.003392"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.682504" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.681958" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.683009" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.682638" elapsed="0.000500"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.683832" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.683400" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.683177" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.682612" elapsed="0.001303"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.684443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.684086" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.684765" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.684538" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.685306" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.685013" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.684845" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.684520" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.685532" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.686323" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.686047" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.686497" elapsed="0.002123"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.674126" elapsed="0.014555"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.688854" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.688751" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.688732" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.689093" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.689164" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:44.691301" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.656810" elapsed="0.034518"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.691378" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.691525" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:44.655130" elapsed="0.036419"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.692711" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.692345" elapsed="0.000430"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.692197" elapsed="0.000617"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.692068" elapsed="0.000775"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.691792" elapsed="0.001101"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:44.651227" elapsed="0.041699"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.698233" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.697921" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.698303" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.698445" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.697586" elapsed="0.000883"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.704568" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.704323" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.705017" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.704757" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.718221" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.718406" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.718579" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.707070" elapsed="0.011565"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.705126" elapsed="0.013611"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.719176" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.718795" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.705108" elapsed="0.014264"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.726628" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.721598" elapsed="0.005131"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.721123" elapsed="0.005680"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.721082" elapsed="0.005778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.729780" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.727544" elapsed="0.002280"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.727014" elapsed="0.002844"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.726944" elapsed="0.002938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.730415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.730051" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.730735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.730510" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.731295" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.730982" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.730814" elapsed="0.000543"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.730492" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.731890" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.731529" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.732229" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.732003" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.732745" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.732459" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.732309" elapsed="0.000496"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.731983" elapsed="0.000843"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.732983" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.733745" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.733478" elapsed="0.000293"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.733918" elapsed="0.003421"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.720163" elapsed="0.017239"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.737576" elapsed="0.000032"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.737471" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.737453" elapsed="0.000214"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.737808" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.737877" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:44.740020" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.698786" elapsed="0.041295"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.740134" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.740283" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:44.697106" elapsed="0.043202"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.741451" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.741082" elapsed="0.000433"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.740918" elapsed="0.000637"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.740790" elapsed="0.000793"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.740526" elapsed="0.001109"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:44.693030" elapsed="0.048637"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.746799" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.746508" elapsed="0.000318"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.746870" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:44.747035" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.746173" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.753125" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.752864" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.753557" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.753316" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.764565" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.764700" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.764850" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.755572" elapsed="0.009314"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.753672" elapsed="0.011273"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.765222" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.765012" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.753653" elapsed="0.011688"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.770027" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.766715" elapsed="0.003378"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.766411" elapsed="0.003729"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.766386" elapsed="0.003789"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.773519" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.770552" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.770252" elapsed="0.003377"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.770228" elapsed="0.003434"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.774411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.773876" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.774859" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.774545" elapsed="0.000393"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.775652" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.775211" elapsed="0.000477"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.774994" elapsed="0.000750"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.774519" elapsed="0.001318"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.776411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.776048" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.776731" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.776506" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.777275" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.776963" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.776811" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.776488" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.777502" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.778288" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.778017" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.778461" elapsed="0.002127"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.765807" elapsed="0.014843"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.780822" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.780719" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.780701" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.781066" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.781138" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:19:44.783279" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.747389" elapsed="0.035919"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.783359" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:44.783507" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:44.745683" elapsed="0.037849"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.784673" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.784306" elapsed="0.000431"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.784159" elapsed="0.000619"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.784028" elapsed="0.000779"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.783751" elapsed="0.001108"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:44.741754" elapsed="0.043138"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:44.651093" elapsed="0.133826"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.648942" elapsed="0.136038"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:19:44.639712" elapsed="0.145322"/>
</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-07T17:19:44.794599" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:44.794222" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.795099" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:44.794782" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:44.795168" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.795332" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.793840" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.800657" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.800357" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.800728" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:44.800873" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.800021" elapsed="0.000876"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.807221" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.806958" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.807692" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.807439" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.818273" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.820483" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.820642" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.809713" elapsed="0.010964"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.807804" elapsed="0.012933"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.821004" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.820773" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.807785" elapsed="0.013340"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.825741" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.822503" elapsed="0.003379"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.822204" elapsed="0.003728"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.822178" elapsed="0.003810"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.829156" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.826375" elapsed="0.002826"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.826071" elapsed="0.003164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.826047" elapsed="0.003213"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.829788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.829416" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.830131" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.829884" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.830661" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.830364" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.830212" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.829866" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.831274" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.830895" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.831612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.831370" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.832155" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.831845" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.831692" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.831352" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.832382" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.833172" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.832884" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.833344" elapsed="0.002126"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.821596" elapsed="0.013937"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.835711" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.835603" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.835583" elapsed="0.000213"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.835936" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.836020" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:19:44.838229" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.801232" elapsed="0.037025"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.838307" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:19:44.838453" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:44.799527" elapsed="0.038952"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.839634" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.839251" elapsed="0.000459"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.839105" elapsed="0.000644"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.838956" elapsed="0.000823"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.838695" elapsed="0.001135"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:44.795580" elapsed="0.044334"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.845277" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.844962" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.845349" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.845492" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.844622" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.851641" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.851372" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.852089" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.851833" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.866468" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.867418" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.867694" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.854096" elapsed="0.013656"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.852199" elapsed="0.015647"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.868265" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.867905" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.852180" elapsed="0.016276"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.875905" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.870687" elapsed="0.005464"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.870206" elapsed="0.006026"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.870165" elapsed="0.006124"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.878927" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.876836" elapsed="0.002151"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.876413" elapsed="0.002609"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.876375" elapsed="0.002672"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.879567" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.879201" elapsed="0.000408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.879912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.879682" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.880464" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.880169" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.880014" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.879663" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.881075" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.880699" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.881399" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.881172" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.881921" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.881631" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.881479" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.881154" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.882165" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.882929" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.882663" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.883120" elapsed="0.002264"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.869242" elapsed="0.016204"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.885623" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.885514" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.885497" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.885847" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.885916" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:19:44.888167" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.845839" elapsed="0.042356"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.888246" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:44.888393" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:44.844137" elapsed="0.044282"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.889564" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.889194" elapsed="0.000446"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.889047" elapsed="0.000632"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.888901" elapsed="0.000807"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.888639" elapsed="0.001121"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:44.840023" elapsed="0.049806"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.895016" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.894702" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:44.895089" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:44.895234" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:44.894366" elapsed="0.000892"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.901416" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.901169" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.901852" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.901612" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:44.915836" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:44.916054" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:44.916165" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:44.903866" elapsed="0.012325"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.901962" elapsed="0.014270"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.916404" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.916258" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.901943" elapsed="0.014545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.921325" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.917862" elapsed="0.003597"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.917555" elapsed="0.003953"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.917530" elapsed="0.004014"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.924930" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:44.921932" elapsed="0.003065"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.921624" elapsed="0.003408"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.921599" elapsed="0.003458"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.925584" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.925214" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.925912" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.925681" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.926465" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.926169" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.926012" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.925662" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.927081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.926705" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.927405" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:44.927177" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.927945" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:44.927636" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:44.927485" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.927160" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:44.928186" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:44.928951" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:44.928684" elapsed="0.000308"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.929142" elapsed="0.002114"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:44.916952" elapsed="0.014366"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:44.931490" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:44.931386" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.931368" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:44.931715" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.931817" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:19:44.934076" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:44.895577" elapsed="0.038527"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:44.934154" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.934301" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:44.893872" elapsed="0.040455"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.935467" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:44.935098" elapsed="0.000445"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:19:44.934933" elapsed="0.000649"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:44.934805" elapsed="0.000807"/>
</for>
<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="PASS" start="2026-04-07T17:19:44.934547" elapsed="0.001116"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:44.889922" elapsed="0.045810"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:44.795446" elapsed="0.140317"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.793285" elapsed="0.142548"/>
</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_operational}</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-07T17:19:44.785219" elapsed="0.150666"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.247914" elapsed="0.688032"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:19:43.913124" elapsed="1.022945"/>
</test>
<test id="s1-s2-s1-t6" name="Create Tap Device Before Fail" line="44">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:44.938960" elapsed="0.000225"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:44.938705" 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-07T17:19:44.940246" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.940137" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.940118" 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-07T17:19:44.945005" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.944882" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.944864" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.946052" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:44.945660" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:44.946532" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:44.946232" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:44.946602" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:44.946754" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:44.945291" elapsed="0.001487"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.951839" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.951718" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.951699" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:44.953132" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:44.953025" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:44.953006" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:44.953697" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:44.953336" elapsed="0.000388"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.954146" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:44.953876" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:44.988294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:44.954702" elapsed="0.033778"/>
</kw>
<msg time="2026-04-07T17:19:44.988653" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:44.988700" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.954326" elapsed="0.034410"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.031344" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:44.989398" elapsed="0.042134"/>
</kw>
<msg time="2026-04-07T17:19:45.031705" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:45.031750" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.988908" elapsed="0.042919"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.032185" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.031909" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.031888" elapsed="0.000417"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.032819" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:45.032445" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.033208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.032991" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.032951" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:45.033340" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.035606" elapsed="0.000538"/>
</kw>
<kw name="Open 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-07T17:19:45.037054" elapsed="0.000604"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.038587" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:45.034185" elapsed="0.004806"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:45.033590" elapsed="0.005517"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:44.952704" elapsed="0.086503"/>
</kw>
<msg time="2026-04-07T17:19:45.039301" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.039344" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.952067" elapsed="0.087314"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:45.039564" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:45.039457" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.039438" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.040046" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.040398" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.040470" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:44.951388" elapsed="0.089190"/>
</kw>
<msg time="2026-04-07T17:19:45.040669" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.040712" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.947170" elapsed="0.093579"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.041086" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.040824" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.040807" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:44.947030" elapsed="0.094158"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.046277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.046170" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.046152" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.047542" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.047437" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.047419" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:45.048333" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:45.047787" elapsed="0.000573"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.048760" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:45.048513" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.084342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:45.049339" elapsed="0.035417"/>
</kw>
<msg time="2026-04-07T17:19:45.085197" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:45.085249" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.048941" elapsed="0.036350"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.129985" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:45.086507" elapsed="0.043911"/>
</kw>
<msg time="2026-04-07T17:19:45.130739" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:45.130791" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.085709" elapsed="0.045122"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.131468" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.131028" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.130942" elapsed="0.000646"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.132296" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:45.131734" elapsed="0.000649"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.132679" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.132465" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.132445" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:45.132820" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.135414" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:19:45.137062" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.138605" elapsed="0.000342"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:45.133847" elapsed="0.005195"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:45.133193" elapsed="0.005968"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:45.047140" elapsed="0.092125"/>
</kw>
<msg time="2026-04-07T17:19:45.139365" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.139411" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.046489" elapsed="0.092958"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:45.139644" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:45.139531" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.139511" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.140179" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.140937" elapsed="0.000168"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.141160" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:45.045791" elapsed="0.095484"/>
</kw>
<msg time="2026-04-07T17:19:45.141374" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.141418" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.041443" elapsed="0.100012"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.141788" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.141533" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.141515" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:45.041307" elapsed="0.100584"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.147267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.147158" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.147138" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.148656" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.148544" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.148526" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:45.149245" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:45.148860" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.149679" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:45.149423" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.179678" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:45.150272" elapsed="0.029574"/>
</kw>
<msg time="2026-04-07T17:19:45.180037" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:45.180086" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.149860" elapsed="0.030262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.224569" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:45.180708" elapsed="0.044133"/>
</kw>
<msg time="2026-04-07T17:19:45.225071" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:45.225117" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.180294" elapsed="0.044860"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.225536" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.225262" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.225230" elapsed="0.000413"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.226237" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "B "e "f "o "r "[78Ce "[A[78C
 "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:45.225785" elapsed="0.000539"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.226600" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.226390" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.226372" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:45.226734" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.229224" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:19:45.230784" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.232230" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:45.227656" elapsed="0.004976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:45.227047" elapsed="0.005726"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:45.148228" elapsed="0.084651"/>
</kw>
<msg time="2026-04-07T17:19:45.232991" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.233038" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.147483" elapsed="0.085594"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:45.233264" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:45.233157" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.233138" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.233741" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.234095" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.234167" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:45.146789" elapsed="0.087487"/>
</kw>
<msg time="2026-04-07T17:19:45.234371" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:45.234415" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:45.142192" elapsed="0.092260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:45.234775" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.234531" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.234513" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:45.142050" elapsed="0.092825"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:44.946828" elapsed="0.288080"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:44.944523" elapsed="0.290482"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:44.939829" elapsed="0.295241"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:44.939385" elapsed="0.295733"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:44.936740" elapsed="0.298489"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:19:45.237939" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.237676" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.237658" elapsed="0.000379"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.238319" 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-07T17:19:45.238420" 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-07T17:19:45.238181" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.239175" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:19:45.238591" elapsed="0.000636"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.239815" level="INFO">${conn_id} = 431</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-07T17:19:45.239445" elapsed="0.000396"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.240725" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:45.240828" 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-07T17:19:45.240456" elapsed="0.000397"/>
</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-07T17:19:45.241021" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.242180" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:45.563805" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:44 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:45.241849" elapsed="0.322093"/>
</kw>
<msg time="2026-04-07T17:19:45.564042" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.241503" elapsed="0.322613"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:45.240068" elapsed="0.324153"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.564710" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:19:45.577273" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:19:45.577535" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:45.577646" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:45.564457" elapsed="0.013241"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.578157" elapsed="0.000527"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.579770" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:45.579127" elapsed="0.000752"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.580390" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.580093" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.580032" elapsed="0.000528"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:45.580945" elapsed="0.000090"/>
</return>
<status status="PASS" start="2026-04-07T17:19:45.580689" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.580654" elapsed="0.000524"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.581254" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.586166" elapsed="0.000440"/>
</kw>
<kw name="Open 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-07T17:19:45.586835" elapsed="0.000237"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.587276" elapsed="0.000131"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:45.582120" elapsed="0.005358"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:45.237152" elapsed="0.350451"/>
</kw>
<msg time="2026-04-07T17:19:45.587676" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.236331" elapsed="0.351416"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:45.235812" elapsed="0.352044"/>
</kw>
<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-07T17:19:45.590758" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.590411" elapsed="0.000452"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.590384" elapsed="0.000504"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.591189" 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-07T17:19:45.591289" 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-07T17:19:45.591049" elapsed="0.000266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.591847" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:19:45.591462" elapsed="0.000430"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.592420" level="INFO">${conn_id} = 433</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-07T17:19:45.592060" elapsed="0.000385"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.593400" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:45.593477" 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-07T17:19:45.593062" elapsed="0.000438"/>
</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-07T17:19:45.593654" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.594828" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:45.918008" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:45 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:45.594517" elapsed="0.323610"/>
</kw>
<msg time="2026-04-07T17:19:45.918196" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.594169" elapsed="0.324093"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:45.592653" elapsed="0.325713"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.918831" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:19:45.931077" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:19:45.931196" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:45.931240" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:45.918581" elapsed="0.012683"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.931425" elapsed="0.000197"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.932652" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:45.932044" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.933212" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:45.932908" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.932863" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:45.933706" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-07T17:19:45.933480" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.933447" elapsed="0.000440"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:45.933960" elapsed="0.000060"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.939870" elapsed="0.000734"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:45.940957" elapsed="0.000359"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:45.941635" elapsed="0.000214"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:45.934647" elapsed="0.007316"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:45.589609" elapsed="0.352666"/>
</kw>
<msg time="2026-04-07T17:19:45.942392" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.588825" elapsed="0.353672"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:45.588145" elapsed="0.354523"/>
</kw>
<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-07T17:19:45.945306" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:45.945035" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:45.945016" elapsed="0.000371"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.945661" 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-07T17:19:45.945765" 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-07T17:19:45.945528" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.946334" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:19:45.945937" elapsed="0.000443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.946909" level="INFO">${conn_id} = 435</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-07T17:19:45.946531" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:45.947824" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:45.947900" 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-07T17:19:45.947550" elapsed="0.000373"/>
</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-07T17:19:45.948094" elapsed="0.000322"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:45.949261" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:46.264530" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:45 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:45.948932" elapsed="0.315778"/>
</kw>
<msg time="2026-04-07T17:19:46.264806" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.948579" elapsed="0.316314"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:45.947158" elapsed="0.317888"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.265622" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:19:46.277880" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:19:46.278061" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:46.278123" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:46.265329" elapsed="0.012828"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.278383" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.279485" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:46.278963" elapsed="0.000625"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.280116" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.279764" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.279711" elapsed="0.000680"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:46.280751" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:19:46.280513" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.280478" elapsed="0.000455"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.281043" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.286897" elapsed="0.000753"/>
</kw>
<kw name="Open 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-07T17:19:46.288086" elapsed="0.000345"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.288779" elapsed="0.000122"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:46.281732" elapsed="0.007220"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:45.944487" elapsed="0.344574"/>
</kw>
<msg time="2026-04-07T17:19:46.289114" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:45.943915" elapsed="0.345250"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:45.943175" elapsed="0.346071"/>
</kw>
<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-07T17:19:46.291357" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.291090" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.291072" elapsed="0.000367"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.291728" 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-07T17:19:46.291831" 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-07T17:19:46.291588" elapsed="0.000269"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.292468" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:19:46.292087" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.293050" level="INFO">${conn_id} = 437</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-07T17:19:46.292667" elapsed="0.000409"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.293966" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:46.294058" 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-07T17:19:46.293682" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.294234" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.295397" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:46.721715" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:46 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:46.295082" elapsed="0.426763"/>
</kw>
<msg time="2026-04-07T17:19:46.721923" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.294714" elapsed="0.427299"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:46.293288" elapsed="0.428904"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.722690" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:19:46.735567" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:19:46.735811" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:46.735907" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:46.722440" elapsed="0.013519"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.736356" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.737866" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:46.737262" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.738444" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.738170" elapsed="0.000379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.738116" elapsed="0.000484"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:46.738943" elapsed="0.000089"/>
</return>
<status status="PASS" start="2026-04-07T17:19:46.738716" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.738683" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.739239" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.743951" elapsed="0.000468"/>
</kw>
<kw name="Open 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-07T17:19:46.744645" elapsed="0.000212"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.745078" elapsed="0.000152"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:46.739915" elapsed="0.005386"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:46.290528" elapsed="0.454900"/>
</kw>
<msg time="2026-04-07T17:19:46.745503" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.289939" elapsed="0.455631"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:46.289443" elapsed="0.456241"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:19:45.235450" elapsed="1.510314"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:19:44.936274" elapsed="1.809658"/>
</test>
<test id="s1-s2-s1-t7" name="Add Tap Device Manually and Verify Before Fail" 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-07T17:19:46.750321" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:46.750062" 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-07T17:19:46.751572" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.751461" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.751443" 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-07T17:19:46.756410" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.756304" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.756285" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.757510" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:46.757090" elapsed="0.000446"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.758014" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:46.757695" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:46.758083" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:46.758237" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:46.756699" elapsed="0.001562"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.763652" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.763542" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.763523" elapsed="0.000202"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.764946" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.764842" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.764825" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:46.765608" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:46.765211" elapsed="0.000424"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.766083" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:46.765790" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.796974" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:46.766764" elapsed="0.030388"/>
</kw>
<msg time="2026-04-07T17:19:46.797350" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:46.797397" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.766262" elapsed="0.031169"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.865248" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:46.798028" elapsed="0.067422"/>
</kw>
<msg time="2026-04-07T17:19:46.865621" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:46.865666" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.797598" elapsed="0.068103"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.866024" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.865780" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.865759" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.866646" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:46.866275" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.867027" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.866796" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.866778" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:46.867160" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.869484" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:19:46.870963" elapsed="0.000642"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.872604" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:46.868010" elapsed="0.005012"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:46.867418" elapsed="0.005722"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:46.764544" elapsed="0.108694"/>
</kw>
<msg time="2026-04-07T17:19:46.873329" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:46.873372" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.763871" elapsed="0.109535"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:46.873646" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:46.873537" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.873516" elapsed="0.000218"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.874144" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.874472" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.874543" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:46.763209" elapsed="0.111440"/>
</kw>
<msg time="2026-04-07T17:19:46.874739" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:46.874782" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.758707" elapsed="0.116109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.875165" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.874891" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.874874" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:46.758567" elapsed="0.116698"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.880442" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.880335" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.880316" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.881704" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.881596" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.881577" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:46.882288" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:46.881916" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.882714" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:46.882467" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.912067" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:46.883369" elapsed="0.028883"/>
</kw>
<msg time="2026-04-07T17:19:46.912426" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:46.912474" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.882893" elapsed="0.029616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.972465" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:46.913100" elapsed="0.059594"/>
</kw>
<msg time="2026-04-07T17:19:46.972885" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:46.972932" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.912681" elapsed="0.060313"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.973318" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.973084" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.973057" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:46.973992" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:46.973573" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.974407" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.974194" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.974176" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:46.974541" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:46.976862" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:19:46.978356" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:46.979892" elapsed="0.000504"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:46.975399" elapsed="0.005071"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:46.974801" elapsed="0.005783"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:46.881288" elapsed="0.099395"/>
</kw>
<msg time="2026-04-07T17:19:46.980774" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:46.980818" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.880656" elapsed="0.100197"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:46.981070" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:46.980931" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.980911" elapsed="0.000244"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.981537" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.981883" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.981956" elapsed="0.000031"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:46.880001" elapsed="0.102081"/>
</kw>
<msg time="2026-04-07T17:19:46.982173" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:46.982218" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.875523" elapsed="0.106729"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:46.982571" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:46.982326" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.982309" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:46.875389" elapsed="0.107283"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.987713" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.987604" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.987586" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:46.988959" elapsed="0.000272"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:46.988852" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:46.988835" elapsed="0.000452"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:46.989795" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:46.989428" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:46.990245" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:46.989995" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.020353" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:46.990804" elapsed="0.029710"/>
</kw>
<msg time="2026-04-07T17:19:47.020729" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:47.020775" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.990426" elapsed="0.030384"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.089192" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:47.021386" elapsed="0.068000"/>
</kw>
<msg time="2026-04-07T17:19:47.089558" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:47.089604" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.020993" elapsed="0.068647"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.089948" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.089721" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.089700" elapsed="0.000394"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.090614" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.090236" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.090997" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.090765" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.090747" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:47.091133" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.093441" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.094919" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:47.096332" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.091986" elapsed="0.004740"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:47.091387" elapsed="0.005452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:46.988552" elapsed="0.108388"/>
</kw>
<msg time="2026-04-07T17:19:47.097049" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:47.097095" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.987925" elapsed="0.109206"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:47.097315" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.097207" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.097189" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.097782" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.098324" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.098403" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:46.987270" elapsed="0.111243"/>
</kw>
<msg time="2026-04-07T17:19:47.098606" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:47.098650" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.982926" elapsed="0.115760"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.099064" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.098796" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.098778" elapsed="0.000366"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:46.982792" elapsed="0.116376"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:46.758374" elapsed="0.340827"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:46.755928" elapsed="0.343329"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:46.751175" elapsed="0.348138"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:46.750731" elapsed="0.348633"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:46.747305" elapsed="0.352111"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:19:47.107259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.106993" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.106962" elapsed="0.000380"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.107623" 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-07T17:19:47.107727" 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-07T17:19:47.107486" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.108543" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2" on remote system "10.30.171.56" 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-07T17:19:47.107904" elapsed="0.000685"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.109121" level="INFO">${conn_id} = 442</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-07T17:19:47.108742" elapsed="0.000405"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.110056" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:47.110317" 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-07T17:19:47.109761" elapsed="0.000582"/>
</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-07T17:19:47.110517" elapsed="0.000342"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.111714" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:47.432790" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:46 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:47.111393" elapsed="0.321523"/>
</kw>
<msg time="2026-04-07T17:19:47.433005" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.111041" elapsed="0.322037"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:47.109367" elapsed="0.323822"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.433660" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-04-07T17:19:47.506882" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:47.507188" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:47.507287" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': coul...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:47.433413" elapsed="0.073927"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:47.507831" elapsed="0.000486"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.509334" level="INFO">ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': could not open network device vport2 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.508704" elapsed="0.000733"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.509872" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.509602" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.509551" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:47.510416" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.510184" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.510150" elapsed="0.000449"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.510672" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.516137" elapsed="0.000317"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.516614" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:47.516913" elapsed="0.000114"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.511391" elapsed="0.005688"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:47.106436" elapsed="0.410732"/>
</kw>
<msg time="2026-04-07T17:19:47.517221" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.105826" elapsed="0.411442"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:47.105315" elapsed="0.412030"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.517869" level="INFO">${dictionary_operational} = {'vport1': '2', 'vport2': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vport1=2</arg>
<arg>vport2=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.517524" elapsed="0.000371"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.518389" level="INFO">${dictionary_config} = {'vport1': '0', 'vport2': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vport1=0</arg>
<arg>vport2=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.518084" elapsed="0.000330"/>
</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-07T17:19:47.528092" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:47.527693" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.528576" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:47.528275" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:47.528644" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:47.528796" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.527321" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.534209" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.533892" elapsed="0.000344"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.534281" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:47.534425" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.533551" elapsed="0.000898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.540790" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.540543" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.541247" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.541004" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.550436" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.550585" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.550709" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.543341" elapsed="0.007405"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.541411" elapsed="0.009409"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.551123" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.550865" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.541391" elapsed="0.009875"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.555770" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.552676" elapsed="0.003158"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.552375" elapsed="0.003506"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.552349" elapsed="0.003567"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.559277" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.556317" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.556014" elapsed="0.003379"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.555988" elapsed="0.003439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.560154" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.559644" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.560481" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.560251" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.561028" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.560717" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.560562" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.560233" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.561625" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.561265" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.561950" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.561718" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.562494" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.562200" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.562047" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.561700" elapsed="0.000877"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.562719" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.563568" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.563267" elapsed="0.000327"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.563744" elapsed="0.002152"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.551763" elapsed="0.014195"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.566152" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.566046" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.566027" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.566379" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.566490" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:19:47.568886" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.534783" elapsed="0.034130"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.568986" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:47.569140" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:47.533065" elapsed="0.036100"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.570333" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.569928" elapsed="0.000473"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.569779" elapsed="0.000663"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.571042" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.570669" elapsed="0.000436"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.570524" elapsed="0.000620"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.569649" elapsed="0.001524"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.569387" elapsed="0.001853"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:47.529047" elapsed="0.042227"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.576631" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.576331" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.576703" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:47.576848" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.575991" elapsed="0.000882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.583082" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.582822" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.583538" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.583297" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.597222" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.597323" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.597413" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.585541" elapsed="0.011898"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.583646" elapsed="0.013835"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.597655" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.597507" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.583628" elapsed="0.014137"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.605219" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.600066" elapsed="0.005256"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.599559" elapsed="0.005838"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.599520" elapsed="0.005934"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.609192" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.606082" elapsed="0.003155"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.605574" elapsed="0.003696"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.605537" elapsed="0.003757"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.609815" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.609448" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.610199" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.609911" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.610744" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.610439" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.610283" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.609893" elapsed="0.000935"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.611370" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.610996" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.611700" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.611472" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.612249" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.611940" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.611787" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.611453" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.612475" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.613261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.612989" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.613435" elapsed="0.002264"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.598584" elapsed="0.017177"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.615933" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.615829" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.615811" elapsed="0.000223"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.616175" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.616245" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:47.618349" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.577208" elapsed="0.041169"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.618427" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:47.618575" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:47.575489" elapsed="0.043110"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.619753" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.619386" elapsed="0.000432"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.619227" elapsed="0.000630"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.620464" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.620105" elapsed="0.000421"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.619937" elapsed="0.000627"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.619097" elapsed="0.001495"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.618819" elapsed="0.001825"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:47.571359" elapsed="0.049319"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.625888" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.625592" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.625959" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:19:47.626122" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.625254" elapsed="0.000892"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.632304" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.632056" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.632737" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.632498" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.644166" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.644267" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.644359" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.634741" elapsed="0.009643"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.632846" elapsed="0.011580"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.644601" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.644453" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.632828" elapsed="0.011859"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.649474" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.646137" elapsed="0.003402"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.645812" elapsed="0.003776"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.645786" elapsed="0.003839"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.652987" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.650025" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.649702" elapsed="0.003402"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.649678" elapsed="0.003461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.653868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.653353" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.654346" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.654026" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.655108" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.654672" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.654460" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.653999" elapsed="0.001225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.655993" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.655467" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.656318" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.656092" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.656838" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.656548" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.656399" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.656073" elapsed="0.000847"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.657078" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.657842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.657575" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.658032" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.645228" elapsed="0.015002"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.660435" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.660298" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.660280" elapsed="0.000244"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.660665" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.660735" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:47.662858" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.626512" elapsed="0.036373"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.662936" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:19:47.663101" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:19:47.624726" elapsed="0.038400"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.664287" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.663902" elapsed="0.000449"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.663756" elapsed="0.000635"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.664990" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.664618" elapsed="0.000436"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.664470" elapsed="0.000623"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.663628" elapsed="0.001493"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.663345" elapsed="0.001827"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:47.620763" elapsed="0.044442"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:47.528882" elapsed="0.136351"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.526722" elapsed="0.138559"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:19:47.518596" elapsed="0.146736"/>
</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-07T17:19:47.675270" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:47.674866" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.675954" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:47.675548" elapsed="0.000450"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:47.676048" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:47.676208" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.674500" elapsed="0.001733"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.681686" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.681391" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.681758" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:47.681902" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.681053" elapsed="0.000873"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.688165" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.687902" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.688596" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.688359" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.698903" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.700903" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.701086" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.690720" elapsed="0.010403"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.688705" elapsed="0.012476"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.701424" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.701218" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.688687" elapsed="0.012854"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.706185" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.702922" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.702616" elapsed="0.003711"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.702591" elapsed="0.003773"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.709271" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.706793" elapsed="0.002523"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.706442" elapsed="0.002908"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.706418" elapsed="0.002957"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.709903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.709530" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.710247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.710016" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.710778" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.710482" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.710328" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.709997" elapsed="0.000862"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.711387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.711027" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.711720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.711482" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.712266" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.711955" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.711802" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.711464" elapsed="0.000884"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.712491" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.713277" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.713007" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.713450" elapsed="0.002277"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.702034" elapsed="0.013760"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.715979" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.715863" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.715844" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.716207" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.716277" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:19:47.718502" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.682263" elapsed="0.036267"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.718580" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:47.718727" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:47.680549" elapsed="0.038204"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.719913" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.719519" elapsed="0.000489"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.719373" elapsed="0.000675"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.720645" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.720279" elapsed="0.000442"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.720130" elapsed="0.000630"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.719245" elapsed="0.001544"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.718984" elapsed="0.001857"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:47.676412" elapsed="0.044497"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.726100" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.725785" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.726172" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:47.726316" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.725440" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.732437" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.732191" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.732871" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.732629" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.747230" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.747441" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.747553" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.734875" elapsed="0.012703"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.732997" elapsed="0.014623"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.747942" elapsed="0.000085"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.747663" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.732977" elapsed="0.015193"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.757534" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.750385" elapsed="0.007254"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.749876" elapsed="0.007799"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.749836" elapsed="0.007866"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.760125" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.757994" elapsed="0.002177"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.757758" elapsed="0.002447"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.757740" elapsed="0.002491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.760760" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.760388" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.761102" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.760857" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.761635" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.761337" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.761185" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.760839" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.762249" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.761869" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.762570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.762345" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.763111" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.762802" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.762651" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.762327" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.763337" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.764152" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.763865" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.764326" elapsed="0.002100"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.748923" elapsed="0.017565"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.766666" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.766557" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.766539" elapsed="0.000215"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.766896" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.766980" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:19:47.769214" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.726655" elapsed="0.042587"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.769292" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:47.769441" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:47.724946" elapsed="0.044521"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.770616" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.770248" elapsed="0.000447"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.770102" elapsed="0.000633"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.771335" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.770959" elapsed="0.000453"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.770815" elapsed="0.000669"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.769954" elapsed="0.001562"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.769688" elapsed="0.001881"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:47.721014" elapsed="0.050588"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.776827" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.776525" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:47.776899" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:47.777064" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.776188" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.783659" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.783412" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.784141" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.783863" elapsed="0.000322"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:47.795900" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:47.796129" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:47.796243" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:47.786151" elapsed="0.010117"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.784251" elapsed="0.012060"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.796487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.796339" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.784233" elapsed="0.012340"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.803851" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"6b9760b6-067d-47f0-8767-09a6456facbc","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"15d458ee-bf20-4419-ae9f-ed33b4feaf8b","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"d4c7b95d-8c3a-4b74-ac17-af1ccb075c67","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"b6:60:97:6b:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":12},{"tp-id":"vport2","ovsdb:port-uuid":"af194725-70f2-4ba0-bf9c-f908f4d8c16e","ovsdb:interface-uuid":"a8616fd3-e35e-4c5c-bc04-3a5491cabc7e","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"4832d824-3886-49b2-95d2-25007e8d6f0f","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"ff13250b-4730-45a6-a068-32651593f43c","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"7f318a70-5097-44a6-8f1b-10141847ae24","ovsdb:interface-uuid":"cbd84c81-028c-4eec-b6ef-40715d555938","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:b6:60:97:6b:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.798650" elapsed="0.005463"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.798176" elapsed="0.006017"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.798133" elapsed="0.006117"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.807014" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.804868" elapsed="0.002192"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.804374" elapsed="0.002720"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.804336" elapsed="0.002783"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.807641" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.807274" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.807998" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.807737" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.808542" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.808242" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.808083" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.807719" elapsed="0.000905"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.809155" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.808776" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.809477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.809252" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.810020" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:47.809708" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:47.809558" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.809234" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.810247" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:47.811119" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:47.810745" elapsed="0.000401"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.811295" elapsed="0.002137"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:47.797216" elapsed="0.016279"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:47.813668" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.813564" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.813545" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.813897" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.813984" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:19:47.816226" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:47.777408" elapsed="0.038846"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:47.816306" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:47.816454" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:19:47.775675" elapsed="0.040804"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.817625" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.817259" elapsed="0.000445"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:19:47.817112" elapsed="0.000631"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.818347" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:47.817984" elapsed="0.000439"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:19:47.817823" elapsed="0.000681"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:47.816965" elapsed="0.001571"/>
</for>
<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="PASS" start="2026-04-07T17:19:47.816699" elapsed="0.001890"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:47.771711" elapsed="0.046913"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:47.676282" elapsed="0.142369"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.673912" elapsed="0.144787"/>
</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_operational}</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-07T17:19:47.665518" elapsed="0.153233"/>
</kw>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.103282" elapsed="0.715531"/>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:19:46.746394" elapsed="1.072544"/>
</test>
<test id="s1-s2-s1-t8" name="Delete the Bridge Manually and Verify Before Fail" 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-07T17:19:47.822416" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:47.822159" 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-07T17:19:47.823645" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.823537" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.823519" 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-07T17:19:47.828283" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.828177" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.828158" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.829323" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:47.828930" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.829799" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:47.829501" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:47.829868" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:47.830037" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:47.828564" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.835099" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.834988" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.834954" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.836422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.836316" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.836297" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:47.837000" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.836627" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.837441" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:47.837182" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.865800" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:47.838018" elapsed="0.028088"/>
</kw>
<msg time="2026-04-07T17:19:47.866364" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:47.866412" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.837619" elapsed="0.028829"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.924223" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:47.867298" elapsed="0.057493"/>
</kw>
<msg time="2026-04-07T17:19:47.925215" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:47.925322" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.866722" elapsed="0.058681"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.926148" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.925596" elapsed="0.000718"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.925543" elapsed="0.000829"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:47.927543" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:47.926678" elapsed="0.001053"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.928431" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.927880" elapsed="0.000713"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.927840" elapsed="0.000809"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:47.928723" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:47.931166" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.932613" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:47.934034" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:47.929666" elapsed="0.004771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:47.929060" elapsed="0.005491"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:47.836013" elapsed="0.098638"/>
</kw>
<msg time="2026-04-07T17:19:47.934747" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:47.934802" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.835311" elapsed="0.099533"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:47.935047" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:47.934922" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.934903" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.935533" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.935877" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.935949" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:47.834637" elapsed="0.101438"/>
</kw>
<msg time="2026-04-07T17:19:47.936193" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:47.936239" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.830411" elapsed="0.105863"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:47.936595" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:47.936351" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.936334" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:47.830277" elapsed="0.106419"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.942072" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.941944" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.941925" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:47.943378" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:47.943266" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:47.943248" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:47.943943" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:47.943586" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.944423" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:47.944168" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:47.984773" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:47.945007" elapsed="0.039949"/>
</kw>
<msg time="2026-04-07T17:19:47.985149" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:47.985195" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.944604" elapsed="0.040626"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.049455" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:47.985782" elapsed="0.063875"/>
</kw>
<msg time="2026-04-07T17:19:48.049832" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:48.049878" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.985397" elapsed="0.064516"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.050233" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.050013" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.049992" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.050841" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.050471" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.051221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.051009" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.050990" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:48.051354" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.053841" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:19:48.055306" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.056697" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.052397" elapsed="0.004705"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:48.051615" elapsed="0.005602"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:47.942939" elapsed="0.114380"/>
</kw>
<msg time="2026-04-07T17:19:48.057414" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.057458" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.942325" elapsed="0.115169"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:48.057681" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.057572" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.057553" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.058213" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.058540" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.058612" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:47.941563" elapsed="0.117156"/>
</kw>
<msg time="2026-04-07T17:19:48.058812" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.058856" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.936960" elapsed="0.121931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.059242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.058996" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.058949" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:47.936823" elapsed="0.122521"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.064595" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.064486" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.064467" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.065852" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.065745" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.065726" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:48.066426" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.066075" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.066852" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:48.066605" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.096585" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:48.067460" elapsed="0.029303"/>
</kw>
<msg time="2026-04-07T17:19:48.096935" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:48.097002" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.067081" elapsed="0.029957"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.155988" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:48.097599" elapsed="0.058575"/>
</kw>
<msg time="2026-04-07T17:19:48.156343" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:48.156387" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.097209" elapsed="0.059212"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.156755" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.156500" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.156479" elapsed="0.000379"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.157390" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.157020" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.157750" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.157539" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.157521" elapsed="0.000365"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:48.157919" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.160219" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:19:48.161650" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.163042" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.158784" elapsed="0.004645"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:48.158200" elapsed="0.005341"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:48.065443" elapsed="0.098200"/>
</kw>
<msg time="2026-04-07T17:19:48.163734" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.163783" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.064811" elapsed="0.099007"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:48.164021" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.163895" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.163876" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.164486" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.165058" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.165134" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:48.064119" elapsed="0.101125"/>
</kw>
<msg time="2026-04-07T17:19:48.165336" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.165379" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.059600" elapsed="0.105813"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.165737" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.165489" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.165472" elapsed="0.000345"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:48.059466" elapsed="0.106375"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:47.830112" elapsed="0.335758"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:47.827783" elapsed="0.338145"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:47.823257" elapsed="0.342763"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:47.822822" elapsed="0.343248"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:47.820032" elapsed="0.346093"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:19:48.174147" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.173842" elapsed="0.000363"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.173823" elapsed="0.000406"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.174530" 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-07T17:19:48.174634" 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-07T17:19:48.174374" elapsed="0.000320"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.175252" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:19:48.174854" elapsed="0.000445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.175824" level="INFO">${conn_id} = 447</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-07T17:19:48.175451" elapsed="0.000398"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.176777" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:19:48.176853" 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-07T17:19:48.176469" elapsed="0.000407"/>
</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-07T17:19:48.177050" elapsed="0.000319"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.178218" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:19:48.508529" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:18:50 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:47 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:19:48.177884" elapsed="0.330738"/>
</kw>
<msg time="2026-04-07T17:19:48.508687" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.177534" elapsed="0.331220"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:19:48.176079" elapsed="0.332764"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.509266" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:19:48.612806" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:19:48.612937" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:19:48.613000" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:19:48.509053" elapsed="0.103972"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.613197" elapsed="0.000242"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.613959" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.613651" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.614246" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.614106" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.614078" elapsed="0.000245"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:19:48.614480" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.614376" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.614362" elapsed="0.000202"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.614597" 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-07T17:19:48.617279" elapsed="0.000322"/>
</kw>
<kw name="Open 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-07T17:19:48.617774" elapsed="0.000157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.618089" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.614919" elapsed="0.003318"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:19:48.173317" elapsed="0.445009"/>
</kw>
<msg time="2026-04-07T17:19:48.618379" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.172747" elapsed="0.445681"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:19:48.172224" elapsed="0.446356"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.619116" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.618764" elapsed="0.000379"/>
</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-07T17:19:48.625076" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:48.624680" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.625559" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:48.625260" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:48.625628" elapsed="0.000037"/>
</return>
<msg time="2026-04-07T17:19:48.625791" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:48.624310" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.631286" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.630984" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:48.631357" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:48.631500" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.630630" elapsed="0.000895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.638197" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.637932" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.638631" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.638391" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:48.647843" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:48.648837" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:48.648945" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:48.640650" elapsed="0.008336"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.638740" elapsed="0.010290"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.649210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.649057" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.638721" elapsed="0.010574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.652566" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.650322" elapsed="0.002332"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.650105" elapsed="0.002584"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.650087" elapsed="0.002627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.655106" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.653001" elapsed="0.002149"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.652770" elapsed="0.002414"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.652753" elapsed="0.002456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.655843" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.655366" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.656361" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.656018" elapsed="0.000430"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.657224" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.656721" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.656483" elapsed="0.000838"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.655987" elapsed="0.001366"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.658211" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.657584" elapsed="0.000666"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.658687" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.658352" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.659271" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.658959" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.658803" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.658325" elapsed="0.001028"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.659496" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:48.660325" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.660016" elapsed="0.000335"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.660502" elapsed="0.002397"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:48.649651" elapsed="0.013327"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:48.663157" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.663051" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.663032" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.663390" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.663460" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:19:48.665671" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:48.631854" elapsed="0.033845"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:48.665775" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:48.665929" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:19:48.630145" elapsed="0.035810"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.667152" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:48.666747" elapsed="0.000478"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:48.666594" elapsed="0.000672"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:48.666463" elapsed="0.000838"/>
</for>
<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="PASS" start="2026-04-07T17:19:48.666202" elapsed="0.001153"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:48.626052" elapsed="0.041370"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.672760" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.672464" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:48.672831" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:48.672991" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.672127" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.679095" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.678834" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.679524" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.679286" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:48.693677" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:48.693935" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:48.694206" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:48.681515" elapsed="0.012749"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.679634" elapsed="0.014727"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.694758" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.694419" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.679615" elapsed="0.015334"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.702747" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.697275" elapsed="0.005551"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.696731" elapsed="0.006129"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.696691" elapsed="0.006194"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.705301" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.703172" elapsed="0.002174"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.702939" elapsed="0.002441"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.702923" elapsed="0.002481"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.705939" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.705558" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.706289" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.706055" elapsed="0.000348"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.706888" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.706589" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.706431" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.706037" elapsed="0.000948"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.707498" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.707139" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.707840" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.707592" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.708404" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.708113" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.707939" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.707575" elapsed="0.000911"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.708629" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:48.709415" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.709142" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.709590" elapsed="0.002260"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:48.695733" elapsed="0.016179"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:48.712105" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.711999" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.711964" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.712331" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.712400" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:48.714577" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:48.673333" elapsed="0.041272"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:48.714656" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:48.714805" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:19:48.671623" elapsed="0.043207"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.716022" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:48.715604" elapsed="0.000487"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:48.715458" elapsed="0.000673"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:48.715328" elapsed="0.000832"/>
</for>
<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="PASS" start="2026-04-07T17:19:48.715068" elapsed="0.001143"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:48.667513" elapsed="0.048731"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.721408" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.721113" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:48.721480" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:48.721623" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.720755" elapsed="0.000892"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.727736" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.727493" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.728183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.727927" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:48.741045" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:48.741253" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:19:48.741394" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:19:48.730261" elapsed="0.011168"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.728350" elapsed="0.013138"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.741732" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.741523" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.728331" elapsed="0.013520"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.749220" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.743635" elapsed="0.005708"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.743165" elapsed="0.006256"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.743125" elapsed="0.006353"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.752727" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.750157" elapsed="0.002615"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.749601" elapsed="0.003206"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.749564" elapsed="0.003268"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.753441" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.753073" elapsed="0.000394"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.753764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.753537" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.754334" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.754033" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.753845" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.753519" elapsed="0.000898"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.754929" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.754568" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.755272" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.755044" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.755835" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:48.755542" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:19:48.755384" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.755025" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.756079" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:19:48.756848" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:19:48.756580" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.757037" elapsed="0.002128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:19:48.742386" elapsed="0.016840"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:19:48.759398" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.759295" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.759277" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.759622" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.759691" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:19:48.761835" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:19:48.721990" elapsed="0.039873"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:19:48.761918" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:48.762102" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:19:48.720278" elapsed="0.041850"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.763268" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:19:48.762880" elapsed="0.000455"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:19:48.762733" elapsed="0.000641"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:19:48.762605" elapsed="0.000798"/>
</for>
<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="PASS" start="2026-04-07T17:19:48.762347" elapsed="0.001107"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:48.716331" elapsed="0.047156"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:48.625883" elapsed="0.137631"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:19:48.623732" elapsed="0.139830"/>
</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-07T17:19:48.619325" elapsed="0.144289"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:19:48.170190" elapsed="0.593489"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:19:47.819362" elapsed="0.944448"/>
</test>
<test id="s1-s2-s1-t9" name="Create Bridge In Owner and Verify Before Fail" 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-07T17:19:48.767087" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:48.766806" 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-07T17:19:48.768369" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.768259" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.768241" 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-07T17:19:48.773121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.773014" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.772995" elapsed="0.000195"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.774243" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:48.773777" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.774730" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:48.774425" elapsed="0.000331"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:48.774801" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:48.774954" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:48.773409" elapsed="0.001586"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.780022" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.779896" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.779877" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.781330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.781222" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.781204" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:48.781897" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.781538" elapsed="0.000385"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.782386" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:48.782117" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.810692" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:48.782949" elapsed="0.027901"/>
</kw>
<msg time="2026-04-07T17:19:48.811064" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:48.811111" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.782567" elapsed="0.028579"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.867635" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:48.811703" elapsed="0.056128"/>
</kw>
<msg time="2026-04-07T17:19:48.868020" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:48.868067" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.811313" elapsed="0.056790"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.868404" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.868182" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.868161" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.869047" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.868645" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.869405" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.869197" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.869178" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:48.869536" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.871884" elapsed="0.000528"/>
</kw>
<kw name="Open 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-07T17:19:48.873357" elapsed="0.002556"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.876883" elapsed="0.000366"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.870419" elapsed="0.006902"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:48.869796" elapsed="0.007643"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:48.780896" elapsed="0.096642"/>
</kw>
<msg time="2026-04-07T17:19:48.877628" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.877672" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.780234" elapsed="0.097473"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:48.877898" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.877786" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.877766" elapsed="0.000361"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.878552" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.878878" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.878949" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:48.779561" elapsed="0.099514"/>
</kw>
<msg time="2026-04-07T17:19:48.879167" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.879210" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.775347" elapsed="0.103897"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.879567" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.879323" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.879306" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:48.775211" elapsed="0.104455"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.884771" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.884665" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.884646" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.886075" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:48.885918" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.885900" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:48.886660" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:48.886305" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.887107" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:48.886838" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.917217" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:48.887661" elapsed="0.029727"/>
</kw>
<msg time="2026-04-07T17:19:48.917559" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:48.917605" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.887285" elapsed="0.030354"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:48.990672" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:48.918347" elapsed="0.072517"/>
</kw>
<msg time="2026-04-07T17:19:48.991051" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:48.991096" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.917820" elapsed="0.073350"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.991475" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.991252" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.991230" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:48.992151" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:48.991714" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.992507" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:48.992299" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.992281" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:48.992637" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:48.994956" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:19:48.996429" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:48.997830" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:48.993494" elapsed="0.004741"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:48.992895" elapsed="0.005453"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:48.885621" elapsed="0.112826"/>
</kw>
<msg time="2026-04-07T17:19:48.998567" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:48.998610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.885013" elapsed="0.113633"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:48.998829" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:48.998723" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:48.998704" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.999311" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:48.999824" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:48.999896" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:48.884329" elapsed="0.115704"/>
</kw>
<msg time="2026-04-07T17:19:49.000127" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.000170" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.879922" elapsed="0.120283"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.000524" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.000280" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.000263" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:48.879787" elapsed="0.120837"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.005881" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.005772" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.005753" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.007176" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.007070" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.007052" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.007773" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.007418" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.008224" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.007957" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.037216" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.008784" elapsed="0.028588"/>
</kw>
<msg time="2026-04-07T17:19:49.037539" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.037584" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.008404" elapsed="0.029214"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.095773" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.038188" elapsed="0.057771"/>
</kw>
<msg time="2026-04-07T17:19:49.096147" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.096192" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.037786" elapsed="0.058440"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.096522" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.096305" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.096284" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.097161" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.096761" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.097518" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.097309" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.097291" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.097650" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.099940" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:19:49.101395" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.102813" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.098484" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.097897" elapsed="0.005439"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.006744" elapsed="0.096693"/>
</kw>
<msg time="2026-04-07T17:19:49.103526" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.103570" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.006114" elapsed="0.097490"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.103786" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.103680" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.103662" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.104269" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.104634" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.104705" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.005433" elapsed="0.099382"/>
</kw>
<msg time="2026-04-07T17:19:49.104909" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.104951" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.000882" elapsed="0.104132"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.105337" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.105093" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.105075" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:49.000745" elapsed="0.104692"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:48.775046" elapsed="0.330421"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:48.772642" elapsed="0.332885"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:48.767954" elapsed="0.337630"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:48.767493" elapsed="0.338136"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:48.764809" elapsed="0.340872"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:49.117542" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.113827" elapsed="0.003758">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:48.764194" elapsed="0.353558">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t10" name="Create Port In Owner and Verify Before Fail" 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-07T17:19:49.121084" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:49.120807" 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-07T17:19:49.122327" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.122219" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.122201" 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-07T17:19:49.126923" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.126816" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.126798" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.127988" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:49.127592" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.128472" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:49.128171" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:49.128540" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:49.128691" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:49.127225" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.134124" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.134015" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.133995" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.135422" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.135316" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.135298" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.135988" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.135625" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.136469" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.136219" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.167883" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.137059" elapsed="0.031030"/>
</kw>
<msg time="2026-04-07T17:19:49.168258" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.168304" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.136647" elapsed="0.031692"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.235843" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.168898" elapsed="0.067151"/>
</kw>
<msg time="2026-04-07T17:19:49.236219" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.236263" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.168506" elapsed="0.067791"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.236596" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.236375" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.236354" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.237224" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.236836" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.237620" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.237371" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.237353" elapsed="0.000367"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.237754" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.240090" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:19:49.241526" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.243016" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.238592" elapsed="0.004818"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.238024" elapsed="0.005500"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.135015" elapsed="0.108612"/>
</kw>
<msg time="2026-04-07T17:19:49.243718" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.243761" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.134337" elapsed="0.109459"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.243993" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.243872" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.243853" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.244461" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.244791" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.244903" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.133656" elapsed="0.111390"/>
</kw>
<msg time="2026-04-07T17:19:49.245139" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.245182" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.129087" elapsed="0.116130"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.245535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.245292" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.245275" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:49.128936" elapsed="0.116699"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.251076" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.250940" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.250922" elapsed="0.000221"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.252314" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.252209" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.252191" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.252870" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.252517" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.253344" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.253091" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.284692" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.253912" elapsed="0.030949"/>
</kw>
<msg time="2026-04-07T17:19:49.285050" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.285096" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.253522" elapsed="0.031609"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.344062" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.285680" elapsed="0.058570"/>
</kw>
<msg time="2026-04-07T17:19:49.344418" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.344463" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.285296" elapsed="0.059201"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.344793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.344574" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.344554" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.345428" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.345056" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.345784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.345575" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.345557" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.345913" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.348211" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.349686" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.351088" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.346744" elapsed="0.004764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.346177" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.251895" elapsed="0.099827"/>
</kw>
<msg time="2026-04-07T17:19:49.351813" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.351856" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.251290" elapsed="0.100601"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.352092" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.351983" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.351949" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.352550" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.352873" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.352943" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.250601" elapsed="0.102464"/>
</kw>
<msg time="2026-04-07T17:19:49.353157" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.353200" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.245891" elapsed="0.107343"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.353549" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.353308" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.353291" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:49.245757" elapsed="0.107891"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.358867" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.358761" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.358742" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.360277" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.360171" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.360153" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.360833" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.360483" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.361288" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.361037" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.390321" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.361843" elapsed="0.028651"/>
</kw>
<msg time="2026-04-07T17:19:49.390661" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.390706" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.361468" elapsed="0.029273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.445674" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.391341" elapsed="0.054568"/>
</kw>
<msg time="2026-04-07T17:19:49.446104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.446149" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.390906" elapsed="0.055278"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.446480" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.446261" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.446241" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.447116" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.446716" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.447499" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.447264" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.447246" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.447631" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.449903" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:19:49.451362" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.452770" elapsed="0.000376"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.448467" elapsed="0.004750"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.447880" elapsed="0.005449"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.359854" elapsed="0.093573"/>
</kw>
<msg time="2026-04-07T17:19:49.453518" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.453561" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.359104" elapsed="0.094492"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.453777" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.453672" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.453653" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.454249" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.454575" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.454646" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.358428" elapsed="0.096323"/>
</kw>
<msg time="2026-04-07T17:19:49.454842" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.454885" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.353899" elapsed="0.101020"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.455269" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.455023" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.455004" elapsed="0.000342"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:49.353766" elapsed="0.101603"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:49.128769" elapsed="0.326652"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:49.126427" elapsed="0.329054"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:49.121911" elapsed="0.333662"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.121500" elapsed="0.334123"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:49.118799" elapsed="0.336880"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:49.467736" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.463845" elapsed="0.003930">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.118129" elapsed="0.349800">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t11" name="Modify the destination IP of Port In Owner Before Fail" line="64">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:49.471123" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:49.470844" 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-07T17:19:49.472389" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.472278" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.472260" 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-07T17:19:49.477071" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.476946" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.476925" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.478124" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:49.477727" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.478608" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:49.478306" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:49.478676" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:49.478827" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:49.477355" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.484108" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.483998" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.483977" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.485361" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.485255" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.485237" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.485934" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.485567" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.486378" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.486131" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.520133" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.486936" elapsed="0.033367"/>
</kw>
<msg time="2026-04-07T17:19:49.520470" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.520515" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.486556" elapsed="0.033993"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.590564" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.521123" elapsed="0.069643"/>
</kw>
<msg time="2026-04-07T17:19:49.590948" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.591062" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.520715" elapsed="0.070386"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.591412" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.591183" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.591162" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.592082" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.591654" elapsed="0.000515"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.592453" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.592239" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.592219" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.592584" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.594888" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.596367" elapsed="0.000473"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.597759" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.593432" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.592840" elapsed="0.005446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.484928" elapsed="0.113457"/>
</kw>
<msg time="2026-04-07T17:19:49.598477" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.598521" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.484320" elapsed="0.114237"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.598741" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.598635" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.598616" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.599223" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.599552" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.599623" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.483642" elapsed="0.116113"/>
</kw>
<msg time="2026-04-07T17:19:49.599850" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.599894" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.479245" elapsed="0.120685"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.600264" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.600020" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.600002" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:49.479108" elapsed="0.121256"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.605588" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.605480" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.605462" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.606873" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.606733" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.606716" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.607459" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.607100" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.607918" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.607640" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.638722" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.608503" elapsed="0.030398"/>
</kw>
<msg time="2026-04-07T17:19:49.639115" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.639162" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.608118" elapsed="0.031080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.718796" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.639803" elapsed="0.079208"/>
</kw>
<msg time="2026-04-07T17:19:49.719180" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.719226" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.639377" elapsed="0.079884"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.719570" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.719345" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.719323" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.720228" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.719809" elapsed="0.000506"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.720593" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.720382" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.720364" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.720727" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.723067" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.724526" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.725923" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.721593" elapsed="0.004739"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.721015" elapsed="0.005433"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.606433" elapsed="0.120116"/>
</kw>
<msg time="2026-04-07T17:19:49.726641" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.726686" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.605804" elapsed="0.120918"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.726910" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.726798" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.726780" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.727395" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.727773" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.727847" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.605139" elapsed="0.122870"/>
</kw>
<msg time="2026-04-07T17:19:49.728108" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.728154" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.600621" elapsed="0.127569"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.728512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.728267" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.728250" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:49.600485" elapsed="0.128129"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.733986" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.733865" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.733846" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.735236" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.735130" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.735112" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.735799" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.735444" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.736457" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.736188" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.767647" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.737038" elapsed="0.030847"/>
</kw>
<msg time="2026-04-07T17:19:49.768173" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.768241" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.736640" elapsed="0.031652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.844000" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.769156" elapsed="0.075061"/>
</kw>
<msg time="2026-04-07T17:19:49.844387" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.844432" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.768538" elapsed="0.075929"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.844760" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.844544" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.844524" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.845388" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.845023" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.845749" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.845539" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.845521" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.845878" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.848256" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:19:49.849658" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.851042" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.846812" elapsed="0.004614"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.846242" elapsed="0.005294"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.734815" elapsed="0.116821"/>
</kw>
<msg time="2026-04-07T17:19:49.851726" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.851769" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.734204" elapsed="0.117600"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.852002" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.851881" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.851862" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.852487" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.852819" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.852890" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.733524" elapsed="0.119488"/>
</kw>
<msg time="2026-04-07T17:19:49.853105" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.853148" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.728873" elapsed="0.124310"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.853502" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.853258" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.853241" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:49.728738" elapsed="0.124863"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:49.478905" elapsed="0.374725"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:49.476556" elapsed="0.377131"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:49.471991" elapsed="0.381752"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.471560" elapsed="0.382229"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:49.468852" elapsed="0.384997"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:49.862098" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.858326" elapsed="0.003811">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.468286" elapsed="0.394000">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t12" name="Verify Port Is Modified Before Fail" 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-07T17:19:49.865403" elapsed="0.000241"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:49.865146" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.866657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.866551" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.866533" 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-07T17:19:49.871383" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.871242" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.871224" elapsed="0.000229"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.872449" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:49.872059" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.872931" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:49.872631" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:49.873017" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:49.873172" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:49.871673" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.878370" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.878264" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.878246" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.879609" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.879503" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.879486" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.880187" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.879813" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.880628" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.880380" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.913639" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.881209" elapsed="0.032599"/>
</kw>
<msg time="2026-04-07T17:19:49.913992" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:49.914039" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.880808" elapsed="0.033266"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.965421" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:49.914625" elapsed="0.050996"/>
</kw>
<msg time="2026-04-07T17:19:49.965789" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:49.965834" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.914242" elapsed="0.051627"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.966203" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.965955" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.965926" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:49.966813" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:49.966441" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.967186" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.966958" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.966941" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:49.967315" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:49.969595" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:19:49.971131" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:49.972536" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:49.968150" elapsed="0.004775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:49.967563" elapsed="0.005493"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.879204" elapsed="0.093953"/>
</kw>
<msg time="2026-04-07T17:19:49.973248" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.973290" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.878583" elapsed="0.094742"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:49.973506" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:19:49.973401" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.973382" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.973982" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.974308" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.974379" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.877915" elapsed="0.096568"/>
</kw>
<msg time="2026-04-07T17:19:49.974575" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:49.974617" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.873555" elapsed="0.101097"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:49.974998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:49.974724" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.974708" elapsed="0.000368"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:49.873420" elapsed="0.101679"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.981854" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.981747" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.981727" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:49.983188" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:49.983079" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:49.983059" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:49.983743" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:49.983392" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:49.984183" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:49.983919" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:50.022410" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:49.984757" elapsed="0.037824"/>
</kw>
<msg time="2026-04-07T17:19:50.022749" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:50.022795" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.984363" elapsed="0.038467"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:50.078345" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:50.023400" elapsed="0.055167"/>
</kw>
<msg time="2026-04-07T17:19:50.078737" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:50.078782" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:50.023016" elapsed="0.055801"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.079140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.078894" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.078874" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.079741" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:50.079375" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.080112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.079886" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.079869" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:50.080244" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:50.082518" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:50.083949" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:50.085368" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:50.081093" elapsed="0.004663"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:50.080492" elapsed="0.005379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:49.982696" elapsed="0.103288"/>
</kw>
<msg time="2026-04-07T17:19:50.086077" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:50.086119" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.982087" elapsed="0.104067"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:50.086336" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:50.086231" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.086213" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.086789" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.087123" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.087193" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:49.981409" elapsed="0.105890"/>
</kw>
<msg time="2026-04-07T17:19:50.087389" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:50.087431" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.975354" elapsed="0.112111"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.087778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.087538" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.087522" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:49.975220" elapsed="0.112656"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.093055" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:50.092922" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.092904" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.094332" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:50.094228" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.094210" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:50.094887" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:50.094536" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:50.095328" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:50.095080" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:50.123705" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:50.095890" elapsed="0.027991"/>
</kw>
<msg time="2026-04-07T17:19:50.124072" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:50.124121" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:50.095509" elapsed="0.028647"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:50.173775" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:50.124733" elapsed="0.049297"/>
</kw>
<msg time="2026-04-07T17:19:50.174223" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:50.174269" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:50.124326" elapsed="0.049978"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.174621" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.174390" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.174364" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.175275" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:50.174868" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.175628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.175420" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.175402" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:50.175760" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:50.178154" elapsed="0.000502"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:50.179566" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:50.180945" elapsed="0.000408"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:50.176660" elapsed="0.004764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:50.176080" elapsed="0.005456"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:50.093914" elapsed="0.087721"/>
</kw>
<msg time="2026-04-07T17:19:50.181726" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:50.181778" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:50.093306" elapsed="0.088508"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:50.182014" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:50.181891" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.181871" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.182480" elapsed="0.000095"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.182885" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.182955" elapsed="0.000046"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:50.092553" elapsed="0.090542"/>
</kw>
<msg time="2026-04-07T17:19:50.183187" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:50.183231" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:50.088143" elapsed="0.095122"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.183584" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.183341" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:50.183323" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:50.088008" elapsed="0.095677"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:49.873250" elapsed="0.310464"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:49.870873" elapsed="0.312896"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:49.866270" elapsed="0.317554"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:49.865844" elapsed="0.318024"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:49.863151" elapsed="0.320771"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.190626" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:19:50.190263" elapsed="0.000390"/>
</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-07T17:19:50.200344" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:50.199952" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.200823" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:50.200524" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:50.200906" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:50.201076" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:50.199586" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.206384" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:50.206086" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:50.206456" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:50.206601" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:50.205720" elapsed="0.000906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.212703" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:50.212459" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:50.213175" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:50.212917" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:50.226577" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:50.226773" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:50.226912" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:50.215307" elapsed="0.012492">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:50.213285" elapsed="0.014727">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.228423" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:50.228088" elapsed="0.000480"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:50.213267" elapsed="0.015353">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.229477" elapsed="0.000056"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.229771" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:50.229691" elapsed="0.000173"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:50.229654" elapsed="0.000257"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:50.230250" elapsed="0.000048"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.230407" elapsed="0.000032"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:50.206950" elapsed="0.023690">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:50.230773" elapsed="0.000032"/>
</return>
<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="FAIL" start="2026-04-07T17:19:50.205238" elapsed="0.025769">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:50.231532" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:50.201286" elapsed="0.030416">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:50.201153" elapsed="0.030673">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:50.198931" elapsed="0.033127">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:51.248581" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:51.248063" elapsed="0.000552"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:51.249134" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:51.248783" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:51.249209" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:51.249387" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:51.247651" elapsed="0.001762"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:51.255009" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:51.254670" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:51.255084" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:51.255231" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:51.254151" elapsed="0.001105"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:51.261671" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:51.261415" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:51.262134" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:51.261868" elapsed="0.000310"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:51.271281" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:51.271426" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:51.271533" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:51.264166" elapsed="0.007762">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:51.262253" elapsed="0.009778">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:51.272217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:51.272065" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:51.262232" elapsed="0.010073">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:51.272670" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:51.272801" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:51.272765" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:51.272749" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:51.273022" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:51.273092" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:51.255598" elapsed="0.017598">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:51.273256" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:19:51.253654" elapsed="0.019693">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:51.273577" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:51.249697" elapsed="0.023955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:51.249547" elapsed="0.024199">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:51.246831" elapsed="0.027009">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:52.289591" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:52.289190" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:52.290097" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:52.289774" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:52.290169" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:52.290324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:52.288800" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:52.295718" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:52.295420" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:52.295791" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:52.295937" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:52.295080" elapsed="0.000882"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:52.302422" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:52.302170" elapsed="0.000300"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:52.302870" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:52.302622" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:52.313407" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:52.313521" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:52.313615" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:52.304885" elapsed="0.009107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:52.303001" elapsed="0.011120">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:52.314396" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:52.314179" elapsed="0.000308"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:52.302979" elapsed="0.011541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:52.315036" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:52.315292" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:52.315237" elapsed="0.000115"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:52.315210" elapsed="0.000172"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:52.315578" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:52.315675" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:52.296304" elapsed="0.019514">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:52.315904" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:19:52.294585" elapsed="0.021471">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:52.316378" elapsed="0.000033"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:52.290543" elapsed="0.025961">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:52.290406" elapsed="0.026180">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:52.288104" elapsed="0.028609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:53.332373" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:53.331837" elapsed="0.000572"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:53.332899" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:53.332582" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:53.332989" elapsed="0.000050"/>
</return>
<msg time="2026-04-07T17:19:53.333177" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:53.331441" elapsed="0.001760"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:53.338840" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:53.338535" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:53.338911" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:53.339073" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:53.338179" elapsed="0.000918"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:53.345505" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:53.345244" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:53.345938" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:53.345698" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:53.355336" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:53.355483" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:53.355670" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:53.347994" elapsed="0.008146">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:53.346084" elapsed="0.010188">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:53.356532" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:53.356320" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:53.346063" elapsed="0.010592">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:53.357178" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:53.357361" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:53.357311" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:53.357287" elapsed="0.000162"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:53.357642" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:53.357739" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:53.339437" elapsed="0.018447">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:53.357989" elapsed="0.000042"/>
</return>
<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="FAIL" start="2026-04-07T17:19:53.337652" elapsed="0.020492">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:53.358462" elapsed="0.000033"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:53.333419" elapsed="0.025150">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:53.333266" elapsed="0.025410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:53.330586" elapsed="0.028222">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:54.374205" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:54.373661" elapsed="0.000580"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:54.374737" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:54.374416" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:54.374824" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:19:54.375019" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:54.373259" elapsed="0.001786"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:54.380612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:54.380306" elapsed="0.000334"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:54.380771" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:19:54.380936" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:54.379932" elapsed="0.001030"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:54.387601" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:54.387301" elapsed="0.000350"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:54.388081" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:54.387811" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:54.398195" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:54.398347" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:54.398455" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:54.390142" elapsed="0.008741">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:54.388204" elapsed="0.010795">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:54.399203" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:54.399042" elapsed="0.000229"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:54.388182" elapsed="0.011113">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:54.399707" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:54.399860" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:54.399816" elapsed="0.000088"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:54.399793" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:54.400108" elapsed="0.000053"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:54.400288" elapsed="0.000035"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:54.381325" elapsed="0.019199">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:54.400663" elapsed="0.000037"/>
</return>
<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="FAIL" start="2026-04-07T17:19:54.379414" elapsed="0.021482">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:54.401520" elapsed="0.000071"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:54.375251" elapsed="0.026476">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:54.375103" elapsed="0.026784">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:54.372415" elapsed="0.029883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:19:55.418260" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:55.417688" elapsed="0.000610"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.418796" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:55.418475" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:55.418875" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:19:55.419090" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:55.417273" elapsed="0.001843"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.424432" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:19:55.424131" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:19:55.424504" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:55.424649" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:19:55.423773" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.431103" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.430827" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.431546" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.431301" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:19:55.441311" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:19:55.441478" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:19:55.441597" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.433600" elapsed="0.008456">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:19:55.431669" elapsed="0.010480">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.442337" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.442184" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:19:55.431647" elapsed="0.010779">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.442800" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.442935" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.442898" elapsed="0.000094"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:19:55.442881" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.443225" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.443296" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.425069" elapsed="0.018336">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.443465" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:19:55.423288" elapsed="0.020269">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:19:55.443790" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:19:55.419347" elapsed="0.024521">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:19:55.419185" elapsed="0.024745">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.416326" elapsed="0.027715">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:19:55.444148" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:19:50.190838" elapsed="5.253405">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:50.188181" elapsed="5.256185">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:49.862612" elapsed="5.581957">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s1-t13" name="Delete Port In Owner 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-07T17:19:55.447875" elapsed="0.000232"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:55.447616" 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-07T17:19:55.449172" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.449060" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.449042" 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-07T17:19:55.453900" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.453793" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.453775" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.454956" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:55.454576" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.455459" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:55.455154" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:55.455527" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:19:55.455726" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:55.454203" elapsed="0.001548"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.460810" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.460689" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.460671" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.462129" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.462021" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.462002" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:55.462701" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:55.462338" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.463168" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:55.462883" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.492351" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:55.463733" elapsed="0.028796"/>
</kw>
<msg time="2026-04-07T17:19:55.492705" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:55.492752" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.463351" elapsed="0.029436"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.553259" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:55.493454" elapsed="0.060035"/>
</kw>
<msg time="2026-04-07T17:19:55.553684" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:55.553734" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.493059" elapsed="0.060713"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.554145" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.553857" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.553834" elapsed="0.000423"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.554833" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.554423" elapsed="0.000498"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.555251" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.555010" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.554989" elapsed="0.000378"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:55.555404" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:55.557885" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:19:55.559356" elapsed="0.000645"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:55.560976" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:55.556345" elapsed="0.005037"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:55.555715" elapsed="0.005786"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:55.461697" elapsed="0.099903"/>
</kw>
<msg time="2026-04-07T17:19:55.561739" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.561784" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.461049" elapsed="0.100770"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:55.562021" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:55.561898" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.561879" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.562492" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.562816" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.562887" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:55.460353" elapsed="0.102654"/>
</kw>
<msg time="2026-04-07T17:19:55.563100" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.563143" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.456126" elapsed="0.107055"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.563502" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.563260" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.563242" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:55.455982" elapsed="0.107620"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.568679" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.568571" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.568551" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.570342" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.570192" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.570167" elapsed="0.000269"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:55.571146" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:55.570631" elapsed="0.000551"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.571743" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:55.571395" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.603830" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:55.573035" elapsed="0.030970"/>
</kw>
<msg time="2026-04-07T17:19:55.604202" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:55.604248" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.572391" elapsed="0.031892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.655817" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:55.604849" elapsed="0.051173"/>
</kw>
<msg time="2026-04-07T17:19:55.656192" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:55.656236" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.604452" elapsed="0.051818"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.656568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.656348" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.656327" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.657254" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.656844" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.657612" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.657400" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.657382" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:55.657742" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:55.660040" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:19:55.661495" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:55.662870" elapsed="0.000478"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:55.658586" elapsed="0.004832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:55.658010" elapsed="0.005522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:55.569751" elapsed="0.093881"/>
</kw>
<msg time="2026-04-07T17:19:55.663721" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.663764" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.568925" elapsed="0.094874"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:55.663999" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:55.663875" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.663856" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.664459" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.664783" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.664854" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:55.568214" elapsed="0.096745"/>
</kw>
<msg time="2026-04-07T17:19:55.665099" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.665142" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.563858" elapsed="0.101318"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.665493" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.665250" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.665233" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:55.563724" elapsed="0.101867"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.670743" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.670634" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.670615" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.672012" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.671879" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.671861" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:55.672568" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:55.672217" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.673049" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:55.672745" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.706620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:55.673693" elapsed="0.033311"/>
</kw>
<msg time="2026-04-07T17:19:55.707384" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:55.707485" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.673270" elapsed="0.034292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.760570" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:55.708831" elapsed="0.051925"/>
</kw>
<msg time="2026-04-07T17:19:55.760925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:55.760989" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.707929" elapsed="0.053098"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.761341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.761121" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.761085" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.761948" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "[78Cf "[A[78Co
 "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.761581" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.762327" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.762116" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.762097" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:55.762458" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:55.764723" elapsed="0.000992"/>
</kw>
<kw name="Open 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-07T17:19:55.766666" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:55.768088" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:55.763292" elapsed="0.005186"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:55.762704" elapsed="0.005888"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:55.671581" elapsed="0.097110"/>
</kw>
<msg time="2026-04-07T17:19:55.768781" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.768823" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.670955" elapsed="0.097923"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:55.769077" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:19:55.768956" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.768937" elapsed="0.000243"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.769558" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.772260" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.772337" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:55.670296" elapsed="0.102158"/>
</kw>
<msg time="2026-04-07T17:19:55.772547" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.772591" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.665844" elapsed="0.106820"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.773006" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.772742" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.772724" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:55.665710" elapsed="0.107398"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:55.455801" elapsed="0.317356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:55.453433" elapsed="0.319781"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:55.448731" elapsed="0.324536"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.448311" elapsed="0.324999"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:55.445627" elapsed="0.327733"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:55.785052" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.781343" elapsed="0.003749">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.445050" elapsed="0.340207">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t14" name="Delete Bridge In Owner And Verify Before Fail" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:55.788429" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:55.788173" 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-07T17:19:55.789683" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.789575" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.789556" 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-07T17:19:55.794285" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.794181" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.794163" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.795329" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:55.794936" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.795811" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:55.795510" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:55.795881" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:55.796049" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:55.794569" elapsed="0.001505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.801393" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.801285" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.801266" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.802639" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.802533" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.802514" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:55.803333" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:55.802845" elapsed="0.000515"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.803764" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:55.803513" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.833570" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:55.804339" elapsed="0.029434"/>
</kw>
<msg time="2026-04-07T17:19:55.833943" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:55.834070" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.803942" elapsed="0.030165"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.895327" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:55.834659" elapsed="0.061101"/>
</kw>
<msg time="2026-04-07T17:19:55.896187" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:55.896294" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.834275" elapsed="0.062100"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.897087" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.896553" elapsed="0.000707"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.896508" elapsed="0.000858"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:55.898437" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:55.897680" elapsed="0.000841"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.898801" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.898589" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.898570" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:55.898934" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:55.901260" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:19:55.902718" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:55.904204" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:55.899780" elapsed="0.004813"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:55.899207" elapsed="0.005501"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:55.802234" elapsed="0.102573"/>
</kw>
<msg time="2026-04-07T17:19:55.904899" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.904943" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.801606" elapsed="0.103394"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:55.905187" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:55.905080" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.905061" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.905687" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.906038" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.906112" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:55.800921" elapsed="0.105298"/>
</kw>
<msg time="2026-04-07T17:19:55.906312" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:55.906355" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.796470" elapsed="0.109921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:55.906759" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:55.906511" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.906493" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:55.796299" elapsed="0.110561"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.912371" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.912263" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.912244" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:55.913802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:55.913695" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:55.913678" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:55.914383" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:55.914030" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.914810" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:55.914563" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:55.946260" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:55.915388" elapsed="0.031047"/>
</kw>
<msg time="2026-04-07T17:19:55.946602" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:55.946648" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.915007" elapsed="0.031676"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.004538" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:55.947255" elapsed="0.057474"/>
</kw>
<msg time="2026-04-07T17:19:56.004897" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.004943" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.946848" elapsed="0.058150"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.005303" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.005078" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.005057" elapsed="0.000370"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.005941" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.005567" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.006320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.006110" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.006092" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.006452" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.008731" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:19:56.010230" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.011624" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.007287" elapsed="0.004745"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.006703" elapsed="0.005444"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:55.913391" elapsed="0.098914"/>
</kw>
<msg time="2026-04-07T17:19:56.012397" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.012441" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.912587" elapsed="0.099891"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.012662" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.012555" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.012537" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.013143" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.013484" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.013557" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:55.911903" elapsed="0.101762"/>
</kw>
<msg time="2026-04-07T17:19:56.013757" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.013802" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.907131" elapsed="0.106707"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.014273" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.014022" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.013896" elapsed="0.000457"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:55.906996" elapsed="0.107380"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.019742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.019632" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.019614" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.021083" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.020954" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.020936" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.021660" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.021291" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.022110" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.021839" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.054602" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.022675" elapsed="0.032096"/>
</kw>
<msg time="2026-04-07T17:19:56.054948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.055017" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.022293" elapsed="0.032761"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.142305" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.055625" elapsed="0.086875"/>
</kw>
<msg time="2026-04-07T17:19:56.142671" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.142718" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.055227" elapsed="0.087528"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.143125" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.142875" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.142853" elapsed="0.000377"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.143751" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78CA "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.143372" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.144135" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.143904" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.143885" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.144274" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.146596" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:19:56.148066" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.149455" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.145117" elapsed="0.004756"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.144526" elapsed="0.005475"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.020652" elapsed="0.129450"/>
</kw>
<msg time="2026-04-07T17:19:56.150193" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.150238" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.019958" elapsed="0.130316"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.150459" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.150351" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.150332" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.150930" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.151278" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.151350" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.019289" elapsed="0.132169"/>
</kw>
<msg time="2026-04-07T17:19:56.151550" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.151595" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.014634" elapsed="0.136997"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.151951" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.151706" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.151689" elapsed="0.000372"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:56.014499" elapsed="0.137585"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:55.796128" elapsed="0.355986"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:55.793805" elapsed="0.358364"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:55.789290" elapsed="0.362935"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:55.788831" elapsed="0.363440"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:55.786188" elapsed="0.366136"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:56.164202" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:56.160472" elapsed="0.003768">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:55.785587" elapsed="0.378795">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t15" name="Kill Owner Instance" 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-07T17:19:56.167425" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:56.167169" 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-07T17:19:56.168660" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.168551" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.168533" 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-07T17:19:56.174007" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.173885" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.173867" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.175060" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:56.174666" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.175544" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:56.175241" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:56.175614" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:56.175766" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:56.174295" elapsed="0.001495"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.181058" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.180920" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.180900" elapsed="0.000227"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.182339" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.182232" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.182214" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.182900" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.182545" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.183350" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.183099" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.211984" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.183909" elapsed="0.028261"/>
</kw>
<msg time="2026-04-07T17:19:56.212341" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.212387" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.183529" elapsed="0.028892"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.248258" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.213020" elapsed="0.035417"/>
</kw>
<msg time="2026-04-07T17:19:56.248603" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.248648" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.212596" elapsed="0.036087"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.248999" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.248761" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.248740" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.249651" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.249281" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.250039" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.249810" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.249792" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.250175" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.252472" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:19:56.253907" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.255305" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.251016" elapsed="0.004675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.250430" elapsed="0.005373"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.181908" elapsed="0.073994"/>
</kw>
<msg time="2026-04-07T17:19:56.256008" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.256053" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.181274" elapsed="0.074815"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.256274" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.256167" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.256148" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.256743" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.257090" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.257164" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.180586" elapsed="0.076688"/>
</kw>
<msg time="2026-04-07T17:19:56.257365" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.257408" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.176165" elapsed="0.081277"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.257770" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.257515" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.257498" elapsed="0.000349"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:56.176024" elapsed="0.081846"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.263277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.263170" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.263151" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.264518" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.264413" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.264395" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.265085" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.264723" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.265507" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.265263" elapsed="0.000269"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.302620" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.266172" elapsed="0.036620"/>
</kw>
<msg time="2026-04-07T17:19:56.302960" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.303026" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.265733" elapsed="0.037329"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.344577" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.303615" elapsed="0.041143"/>
</kw>
<msg time="2026-04-07T17:19:56.344926" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.344997" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.303229" elapsed="0.041807"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.345330" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.345114" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.345094" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.345951" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.345567" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.346317" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.346110" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.346091" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.346448" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.348726" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:19:56.350203" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.351555" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.347286" elapsed="0.004656"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.346695" elapsed="0.005375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.264114" elapsed="0.088056"/>
</kw>
<msg time="2026-04-07T17:19:56.352260" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.352303" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.263490" elapsed="0.088848"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.352520" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.352414" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.352395" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.353004" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.353387" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.353459" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.262820" elapsed="0.090746"/>
</kw>
<msg time="2026-04-07T17:19:56.353657" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.353699" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.258155" elapsed="0.095616"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.354155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.353864" elapsed="0.000346"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.353846" elapsed="0.000388"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:56.258020" elapsed="0.096237"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.359651" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.359543" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.359525" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.360915" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.360810" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.360792" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.361503" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.361151" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.361945" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.361680" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.386576" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.362519" elapsed="0.024226"/>
</kw>
<msg time="2026-04-07T17:19:56.386912" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.386958" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.362143" elapsed="0.024871"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.417659" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.387569" elapsed="0.030271"/>
</kw>
<msg time="2026-04-07T17:19:56.418046" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.418092" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.387183" elapsed="0.030944"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.418418" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.418205" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.418184" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.419042" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "K "i "l "l "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.418657" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.419390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.419181" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.419163" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.419520" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.421788" elapsed="0.000550"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.423268" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.424641" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.420349" elapsed="0.004696"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.419766" elapsed="0.005394"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.360511" elapsed="0.064783"/>
</kw>
<msg time="2026-04-07T17:19:56.425386" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.425430" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.359863" elapsed="0.065602"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.425648" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.425542" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.425523" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.426150" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.426481" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.426552" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.359207" elapsed="0.067451"/>
</kw>
<msg time="2026-04-07T17:19:56.426749" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.426793" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.354512" elapsed="0.072315"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.427170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.426901" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.426884" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:56.354377" elapsed="0.072893"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:56.175842" elapsed="0.251456"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:56.173514" elapsed="0.253839"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:56.168267" elapsed="0.259142"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.167834" elapsed="0.259619"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:56.165183" elapsed="0.262322"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:19:56.431883" 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-07T17:19:56.427751" elapsed="0.004171">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<arg>${original_candidate_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.432107" elapsed="0.000023"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-07T17:19:56.164700" elapsed="0.267566">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t16" name="Check Shards Status After Fail" line="85">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:56.435407" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:56.435146" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.436633" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.436524" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.436505" 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-07T17:19:56.441245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.441139" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.441121" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.442308" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:56.441910" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.442787" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:56.442488" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:56.442896" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:19:56.443071" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:56.441528" elapsed="0.001568"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.448287" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.448180" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.448161" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.449607" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.449500" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.449482" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.450202" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.449810" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.450627" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.450380" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.479313" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.451203" elapsed="0.028278"/>
</kw>
<msg time="2026-04-07T17:19:56.479648" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.479694" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.450807" elapsed="0.028921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.525732" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.480298" elapsed="0.045621"/>
</kw>
<msg time="2026-04-07T17:19:56.526132" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.526178" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.479895" elapsed="0.046318"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.526508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.526291" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.526270" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.527144" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.526747" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.527497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.527289" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.527272" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.527627" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.529894" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:19:56.531392" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.532781" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.528463" elapsed="0.004724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.527877" elapsed="0.005422"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.449200" elapsed="0.084235"/>
</kw>
<msg time="2026-04-07T17:19:56.533526" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.533569" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.448501" elapsed="0.085104"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.533788" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.533681" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.533663" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.534292" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.534613" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.534684" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.447829" elapsed="0.086960"/>
</kw>
<msg time="2026-04-07T17:19:56.534881" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.534924" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.443450" elapsed="0.091508"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.535307" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.535063" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.535045" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:56.443314" elapsed="0.092093"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.540885" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.540777" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.540758" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.542190" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.542082" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.542063" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.542747" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.542395" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.543189" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.542924" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.575511" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.543749" elapsed="0.032118"/>
</kw>
<msg time="2026-04-07T17:19:56.576281" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.576386" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.543370" elapsed="0.033095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.626994" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.577744" elapsed="0.049442"/>
</kw>
<msg time="2026-04-07T17:19:56.627353" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.627398" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.576843" elapsed="0.050588"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.627740" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.627510" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.627490" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.628436" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.628053" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.628793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.628582" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.628564" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.628924" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.631259" elapsed="0.000500"/>
</kw>
<kw name="Open 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-07T17:19:56.632679" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.634064" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.629769" elapsed="0.004698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.629195" elapsed="0.005384"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.541725" elapsed="0.092953"/>
</kw>
<msg time="2026-04-07T17:19:56.634768" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.634811" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.541115" elapsed="0.093731"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.635046" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.634923" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.634903" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.635507" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.635833" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.635903" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.540439" elapsed="0.095589"/>
</kw>
<msg time="2026-04-07T17:19:56.636121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.636164" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.535661" elapsed="0.100538"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.636517" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.636273" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.636256" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:56.535525" elapsed="0.101091"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.641898" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.641792" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.641773" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.643326" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.643219" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.643200" elapsed="0.000196"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.643881" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.643532" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.644323" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.644076" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.667870" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.644919" elapsed="0.023183"/>
</kw>
<msg time="2026-04-07T17:19:56.668269" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.668315" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.644540" elapsed="0.023810"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.710104" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.668900" elapsed="0.041402"/>
</kw>
<msg time="2026-04-07T17:19:56.710474" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.710521" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.668516" elapsed="0.042040"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.710856" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.710635" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.710615" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.711503" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.711127" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.711863" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.711650" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.711631" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.712013" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.714331" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.715862" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.717244" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.712842" elapsed="0.004789"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.712269" elapsed="0.005478"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.642756" elapsed="0.075091"/>
</kw>
<msg time="2026-04-07T17:19:56.717937" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.717996" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.642152" elapsed="0.075881"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.718244" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.718112" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.718093" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.718709" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.719053" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.719125" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.641452" elapsed="0.077780"/>
</kw>
<msg time="2026-04-07T17:19:56.719371" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.719416" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.636871" elapsed="0.082580"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.719773" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.719528" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.719511" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:56.636736" elapsed="0.083137"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:56.443148" elapsed="0.276754"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:56.440769" elapsed="0.279188"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:56.436240" elapsed="0.283804"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.435812" elapsed="0.284279"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:56.433078" elapsed="0.287066"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:56.725551" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-07T17:19:56.720342" elapsed="0.005248">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-04-07T17:19:56.432466" elapsed="0.293264">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t17" name="Check Entity Owner Status And Find Owner and Candidate After Fail" line="89">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:56.729197" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:56.728922" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.730460" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.730350" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.730332" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.735129" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.735020" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.735001" elapsed="0.000197"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.736178" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:56.735785" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.736659" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:56.736358" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:56.736729" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:56.736881" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:56.735416" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.742115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.742006" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.741987" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.743398" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.743292" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.743274" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.743957" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.743606" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.744407" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.744157" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.773141" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.744981" elapsed="0.028361"/>
</kw>
<msg time="2026-04-07T17:19:56.773514" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.773561" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.744589" elapsed="0.029008"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.852004" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.774250" elapsed="0.078074"/>
</kw>
<msg time="2026-04-07T17:19:56.852580" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.852647" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.773770" elapsed="0.078929"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.853163" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.852814" elapsed="0.000460"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.852785" elapsed="0.000525"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.854082" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.853511" elapsed="0.000707"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.854643" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.854316" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.854290" elapsed="0.000500"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.854838" elapsed="0.000042"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.858273" elapsed="0.000811"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.860091" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.861463" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.856111" elapsed="0.005739"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.855247" elapsed="0.006716"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.742991" elapsed="0.119089"/>
</kw>
<msg time="2026-04-07T17:19:56.862173" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.862217" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.742354" elapsed="0.119898"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.862448" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.862328" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.862309" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.862912" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.863265" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.863336" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.741656" elapsed="0.121785"/>
</kw>
<msg time="2026-04-07T17:19:56.863534" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.863576" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.737283" elapsed="0.126361"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.863982" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.863723" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.863705" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:56.737143" elapsed="0.126943"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.869413" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.869305" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.869287" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.870673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.870567" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.870549" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.871314" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.870876" elapsed="0.000465"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.871743" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.871494" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.903053" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.872317" elapsed="0.030907"/>
</kw>
<msg time="2026-04-07T17:19:56.903392" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:56.903438" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.871924" elapsed="0.031548"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.978771" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:56.904041" elapsed="0.074950"/>
</kw>
<msg time="2026-04-07T17:19:56.979164" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:56.979210" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.903639" elapsed="0.075606"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.979541" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.979323" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.979303" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:56.980188" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:56.979779" elapsed="0.000497"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.980554" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.980343" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.980325" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:56.980685" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:56.982957" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:19:56.984383" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:56.985774" elapsed="0.000348"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:56.981518" elapsed="0.004674"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:56.980935" elapsed="0.005515"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.870253" elapsed="0.116310"/>
</kw>
<msg time="2026-04-07T17:19:56.986655" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.986698" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.869626" elapsed="0.117107"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:56.986919" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:19:56.986812" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.986792" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.987400" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.987721" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.987791" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.868955" elapsed="0.118941"/>
</kw>
<msg time="2026-04-07T17:19:56.988018" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:56.988063" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.864343" elapsed="0.123755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:56.988416" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:56.988173" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.988156" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:56.864207" elapsed="0.124307"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.993831" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.993724" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.993706" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:56.995184" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:56.995078" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:56.995060" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:56.995735" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:56.995386" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:56.996177" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:56.995912" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:57.024839" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:56.996730" elapsed="0.028500"/>
</kw>
<msg time="2026-04-07T17:19:57.025602" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:57.025703" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.996357" elapsed="0.029423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.016170" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:57.027149" elapsed="1.989456"/>
</kw>
<msg time="2026-04-07T17:19:59.016904" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.016956" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:57.026213" elapsed="1.990803"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.017686" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.017284" elapsed="0.000493"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.017234" elapsed="0.000571"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.018479" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.017954" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.018855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.018641" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.018622" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.019009" elapsed="0.000046"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.021557" elapsed="0.000553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.023111" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.024585" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.020003" elapsed="0.005004"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.019345" elapsed="0.005779"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:56.994756" elapsed="2.030471"/>
</kw>
<msg time="2026-04-07T17:19:59.025324" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.025377" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.994137" elapsed="2.031276"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.025601" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.025493" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.025473" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.026121" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.026484" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.026557" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:56.993389" elapsed="2.033282"/>
</kw>
<msg time="2026-04-07T17:19:59.026771" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.026816" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.988765" elapsed="2.038087"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.027196" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.026930" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.026913" elapsed="0.000366"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:56.988631" elapsed="2.038672"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:56.736958" elapsed="2.290381"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:56.734645" elapsed="2.292756"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:56.730041" elapsed="2.297421"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:56.729606" elapsed="2.297903"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:56.726683" elapsed="2.300939"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:59.039560" level="FAIL">Variable '${original_candidate}' not found.</msg>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>${original_candidate}</arg>
<arg>${new_cluster_list}</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:19:59.035658" elapsed="0.003941">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_candidate}</var>
<arg>${new_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.039776" elapsed="0.000023"/>
</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-07T17:19:59.039957" elapsed="0.000036"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.040144" elapsed="0.000021"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:19:56.726079" elapsed="2.314227">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s1-t18" name="Create Bridge Manually and Verify After Fail" line="99">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:59.044301" elapsed="0.000218"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:59.044043" 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-07T17:19:59.045569" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.045457" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.045439" 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-07T17:19:59.050195" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.050088" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.050070" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.051281" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:59.050879" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.051764" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:59.051464" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:59.051834" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:19:59.052004" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:59.050493" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.057353" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.057245" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.057226" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.058621" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.058514" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.058496" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.059233" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.058850" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.059671" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.059417" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.091674" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.060254" elapsed="0.031579"/>
</kw>
<msg time="2026-04-07T17:19:59.092047" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.092094" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.059852" elapsed="0.032277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.151771" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.092683" elapsed="0.059336"/>
</kw>
<msg time="2026-04-07T17:19:59.152191" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.152237" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.092296" elapsed="0.059975"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.152567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.152349" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.152329" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.153203" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.152803" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.153570" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.153359" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.153341" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.153701" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.156016" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:19:59.157474" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.158864" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.154547" elapsed="0.004722"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.153954" elapsed="0.005426"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.058215" elapsed="0.101264"/>
</kw>
<msg time="2026-04-07T17:19:59.159569" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.159612" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.057569" elapsed="0.102078"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.159854" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.159723" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.159704" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.160332" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.160655" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.160725" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.056889" elapsed="0.103941"/>
</kw>
<msg time="2026-04-07T17:19:59.160921" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.160963" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.052405" elapsed="0.108623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.161350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.161106" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.161088" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:59.052264" elapsed="0.109186"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.166862" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.166755" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.166736" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.168203" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.168095" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.168077" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.168763" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.168410" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.169207" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.168942" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.202174" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.169765" elapsed="0.032590"/>
</kw>
<msg time="2026-04-07T17:19:59.202545" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.202591" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.169388" elapsed="0.033237"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.268555" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.203201" elapsed="0.065537"/>
</kw>
<msg time="2026-04-07T17:19:59.268918" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.268964" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.202791" elapsed="0.066226"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.269312" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.269095" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.269075" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.269912" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.269551" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.270293" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.270083" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.270065" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.270428" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.272675" elapsed="0.000544"/>
</kw>
<kw name="Open 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-07T17:19:59.274133" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.275507" elapsed="0.000313"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.271265" elapsed="0.004626"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.270679" elapsed="0.005344"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.167741" elapsed="0.108382"/>
</kw>
<msg time="2026-04-07T17:19:59.276213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.276256" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.167133" elapsed="0.109158"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.276479" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.276372" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.276351" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.276947" elapsed="0.000096"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.277353" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.277424" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.166418" elapsed="0.111113"/>
</kw>
<msg time="2026-04-07T17:19:59.277622" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.277666" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.161702" elapsed="0.115998"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.278036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.277774" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.277757" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:59.161569" elapsed="0.116568"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.283577" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.283469" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.283451" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.284820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.284713" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.284695" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.285401" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.285051" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.285825" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.285580" elapsed="0.000270"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.314676" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.286397" elapsed="0.028437"/>
</kw>
<msg time="2026-04-07T17:19:59.315034" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.315080" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.286020" elapsed="0.029094"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.380508" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.315711" elapsed="0.064984"/>
</kw>
<msg time="2026-04-07T17:19:59.380864" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.380911" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.315290" elapsed="0.065655"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.381272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.381053" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.381032" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.381878" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.381511" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.382269" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.382059" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.382041" elapsed="0.000362"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.382436" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.384715" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.386199" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.387598" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.383274" elapsed="0.004731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.382686" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.284416" elapsed="0.103805"/>
</kw>
<msg time="2026-04-07T17:19:59.388311" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.388354" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.283790" elapsed="0.104599"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.388572" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.388466" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.388447" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.389099" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.389459" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.389531" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.282914" elapsed="0.106725"/>
</kw>
<msg time="2026-04-07T17:19:59.389731" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.389774" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.278392" elapsed="0.111417"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.390153" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.389883" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.389866" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:59.278258" elapsed="0.111993"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:59.052087" elapsed="0.338193"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:59.049713" elapsed="0.340621"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:59.045151" elapsed="0.345237"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.044718" elapsed="0.345714"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:59.041660" elapsed="0.348824"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:59.398649" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:59.394837" elapsed="0.003851">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:59.040994" elapsed="0.357837">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t19" name="Add Port Manually and Verify After Fail" line="103">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:59.401823" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:59.401569" elapsed="0.000558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.403094" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.402965" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.402947" elapsed="0.000257"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.407957" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.407852" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.407834" elapsed="0.000211"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.409029" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:59.408635" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.409515" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:59.409212" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:59.409585" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:59.409736" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:59.408262" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.414961" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.414853" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.414834" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.416237" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.416130" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.416112" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.416790" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.416442" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.417238" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.416990" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.445839" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.417801" elapsed="0.028221"/>
</kw>
<msg time="2026-04-07T17:19:59.446211" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.446257" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.417423" elapsed="0.028869"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.499994" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.446859" elapsed="0.053322"/>
</kw>
<msg time="2026-04-07T17:19:59.500349" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.500394" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.446462" elapsed="0.053967"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.500722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.500505" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.500486" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.501360" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.500963" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.501720" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.501510" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.501492" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.501851" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.504222" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:19:59.505637" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.507087" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.502768" elapsed="0.004711"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.502155" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.415806" elapsed="0.091885"/>
</kw>
<msg time="2026-04-07T17:19:59.507781" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.507824" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.415193" elapsed="0.092666"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.508073" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.507935" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.507917" elapsed="0.000240"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.508536" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.508859" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.508930" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.414520" elapsed="0.094533"/>
</kw>
<msg time="2026-04-07T17:19:59.509144" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.509186" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.410135" elapsed="0.099085"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.509539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.509294" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.509277" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:59.409997" elapsed="0.099640"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.515169" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.515033" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.515013" elapsed="0.000225"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.516448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.516342" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.516324" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.517015" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.516651" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.517486" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.517195" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.548104" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.518058" elapsed="0.030200"/>
</kw>
<msg time="2026-04-07T17:19:59.548444" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.548489" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.517665" elapsed="0.030859"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.610409" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.549167" elapsed="0.061489"/>
</kw>
<msg time="2026-04-07T17:19:59.610826" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.610872" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.548687" elapsed="0.062220"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.611232" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.611010" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.610963" elapsed="0.000383"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.611875" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.611510" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.612270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.612059" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.612041" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.612401" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.614663" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:19:59.616128" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.617481" elapsed="0.000312"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.613233" elapsed="0.004631"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.612647" elapsed="0.005344"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.516041" elapsed="0.102052"/>
</kw>
<msg time="2026-04-07T17:19:59.618183" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.618226" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.515383" elapsed="0.102878"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.618451" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.618337" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.618318" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.618910" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.619254" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.619325" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.514670" elapsed="0.104760"/>
</kw>
<msg time="2026-04-07T17:19:59.619521" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.619564" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.509886" elapsed="0.109712"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.619913" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.619672" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.619655" elapsed="0.000375"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:59.509754" elapsed="0.110302"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.625224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.625116" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.625097" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.626521" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.626414" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.626396" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.627091" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.626725" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.627516" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.627269" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.662405" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.628118" elapsed="0.034441"/>
</kw>
<msg time="2026-04-07T17:19:59.662725" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.662771" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.627696" elapsed="0.035109"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.715141" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.663481" elapsed="0.051842"/>
</kw>
<msg time="2026-04-07T17:19:59.715487" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.715531" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.662974" elapsed="0.052592"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.715857" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.715642" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.715622" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.716485" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.716121" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.716839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.716630" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.716612" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.717015" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.719254" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:19:59.720732" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.722130" elapsed="0.000313"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.717829" elapsed="0.004684"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.717265" elapsed="0.005358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.626107" elapsed="0.096614"/>
</kw>
<msg time="2026-04-07T17:19:59.722811" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.722854" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.625475" elapsed="0.097413"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.723089" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.722964" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.722945" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.723545" elapsed="0.000060"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.723912" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.724000" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.624753" elapsed="0.099357"/>
</kw>
<msg time="2026-04-07T17:19:59.724202" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.724246" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.620311" elapsed="0.103970"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.724637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.724367" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.724346" elapsed="0.000368"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:59.620174" elapsed="0.104563"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:59.409812" elapsed="0.314953"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:59.407496" elapsed="0.317321"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:59.402684" elapsed="0.322188"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.402272" elapsed="0.322644"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:59.399590" elapsed="0.325440"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:19:59.734759" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:19:59.730509" elapsed="0.004296">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:19:59.399056" elapsed="0.335887">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t20" name="Create Tap Device After Fail" line="107">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:19:59.737882" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:19:59.737628" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.739131" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.739021" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.739002" 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-07T17:19:59.743795" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.743690" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.743673" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.744837" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:19:59.744463" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.745349" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:19:59.745034" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:19:59.745419" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:19:59.745570" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:19:59.744096" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.750843" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.750737" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.750718" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.752108" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.751999" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.751957" elapsed="0.000254"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.752709" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.752353" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.753157" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.752888" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.784116" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.753732" elapsed="0.030545"/>
</kw>
<msg time="2026-04-07T17:19:59.784446" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.784491" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.753352" elapsed="0.031173"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.835393" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.785175" elapsed="0.050404"/>
</kw>
<msg time="2026-04-07T17:19:59.835746" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.835791" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.784694" elapsed="0.051131"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.836150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.835904" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.835883" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.836759" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.836390" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.837133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.836902" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.836885" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.837266" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.839638" elapsed="0.000603"/>
</kw>
<kw name="Open 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-07T17:19:59.841218" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.842645" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.838166" elapsed="0.004887"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.837554" elapsed="0.005611"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.751679" elapsed="0.091586"/>
</kw>
<msg time="2026-04-07T17:19:59.843355" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.843398" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.751073" elapsed="0.092360"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.843615" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.843510" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.843490" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.844092" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.844468" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.844539" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.750403" elapsed="0.094243"/>
</kw>
<msg time="2026-04-07T17:19:59.844737" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.844781" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.745940" elapsed="0.098875"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.845165" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.844889" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.844872" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:19:59.745806" elapsed="0.099460"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.850813" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.850704" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.850685" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.852116" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.852008" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.851989" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.852674" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.852320" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.853136" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.852852" elapsed="0.000310"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.882548" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.853696" elapsed="0.029021"/>
</kw>
<msg time="2026-04-07T17:19:59.882886" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.882931" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.853315" elapsed="0.029655"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.928754" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.883541" elapsed="0.045411"/>
</kw>
<msg time="2026-04-07T17:19:59.929147" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:19:59.929192" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.883155" elapsed="0.046072"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.929530" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.929305" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.929285" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:19:59.930176" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:19:59.929772" elapsed="0.000481"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.930531" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.930321" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.930302" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:19:59.930660" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:19:59.932954" elapsed="0.000572"/>
</kw>
<kw name="Open 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-07T17:19:59.934465" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:19:59.935887" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:19:59.931513" elapsed="0.004782"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:19:59.930926" elapsed="0.005482"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.851692" elapsed="0.084816"/>
</kw>
<msg time="2026-04-07T17:19:59.936598" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.936642" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.851046" elapsed="0.085631"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:19:59.936859" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:19:59.936754" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.936735" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.937337" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.937661" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.937731" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.850344" elapsed="0.087492"/>
</kw>
<msg time="2026-04-07T17:19:59.937927" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:19:59.937974" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.845520" elapsed="0.092516"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:19:59.938359" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:19:59.938112" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.938095" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:19:59.845385" elapsed="0.093074"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.943919" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.943813" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.943795" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:19:59.945276" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:19:59.945086" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-07T17:19:59.945068" elapsed="0.000275"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:19:59.945833" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:19:59.945480" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.946286" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:19:59.946036" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:19:59.978290" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:19:59.946845" elapsed="0.031615"/>
</kw>
<msg time="2026-04-07T17:19:59.978626" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:19:59.978671" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.946466" elapsed="0.032239"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.026251" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:19:59.979298" elapsed="0.047403"/>
</kw>
<msg time="2026-04-07T17:20:00.026966" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:00.027033" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.978869" elapsed="0.048203"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:00.027579" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.027208" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.027165" elapsed="0.000609"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.028485" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CF
 "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:00.027932" elapsed="0.000636"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:00.028858" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.028637" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.028618" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:00.029021" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.031616" elapsed="0.000561"/>
</kw>
<kw name="Open 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-07T17:20:00.033135" elapsed="0.000568"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:00.034646" elapsed="0.000367"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:00.030058" elapsed="0.005031"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:00.029379" elapsed="0.005824"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:19:59.944756" elapsed="0.090551"/>
</kw>
<msg time="2026-04-07T17:20:00.035405" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:00.035451" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.944153" elapsed="0.091335"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:00.035679" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:20:00.035570" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.035550" elapsed="0.000247"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:00.036241" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:00.036591" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:00.036663" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:19:59.943479" elapsed="0.093296"/>
</kw>
<msg time="2026-04-07T17:20:00.036874" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:00.036919" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.938711" elapsed="0.098249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:00.037320" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.037070" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.037052" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:19:59.938578" elapsed="0.098846"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:19:59.745643" elapsed="0.291818"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:19:59.743293" elapsed="0.294232"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:19:59.738722" elapsed="0.298914"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:19:59.738312" elapsed="0.299378"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:19:59.735624" elapsed="0.302126"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:20:00.040370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.040103" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.040083" elapsed="0.000367"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.041081" 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-07T17:20:00.041192" 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-07T17:20:00.040600" elapsed="0.000618"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.041781" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:20:00.041390" elapsed="0.000437"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.042378" level="INFO">${conn_id} = 485</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-07T17:20:00.041996" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.043447" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:00.043525" 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-07T17:20:00.043135" elapsed="0.000414"/>
</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-07T17:20:00.043705" elapsed="0.000366"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.044923" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:00.623671" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:48 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:00.044604" elapsed="0.579241"/>
</kw>
<msg time="2026-04-07T17:20:00.623930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.044238" elapsed="0.579792"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:00.042619" elapsed="0.581528"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.624674" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:20:00.636643" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:20:00.636829" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:00.636891" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:00.624395" elapsed="0.012529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:00.637178" elapsed="0.000394"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.638704" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:00.638045" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:00.639336" elapsed="0.000039"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:00.639030" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.638943" elapsed="0.000562"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:00.639880" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-07T17:20:00.639632" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.639595" elapsed="0.000520"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:00.640198" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.646230" elapsed="0.000332"/>
</kw>
<kw name="Open 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-07T17:20:00.646724" elapsed="0.000180"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:00.647066" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:00.641118" elapsed="0.006100"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:00.039475" elapsed="0.607836"/>
</kw>
<msg time="2026-04-07T17:20:00.647367" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.038864" elapsed="0.608551"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:00.038370" elapsed="0.609126"/>
</kw>
<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-07T17:20:00.649599" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.649329" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.649309" elapsed="0.000370"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.649967" 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-07T17:20:00.650085" 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-07T17:20:00.649823" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.650633" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:20:00.650256" elapsed="0.000423"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.651216" level="INFO">${conn_id} = 487</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-07T17:20:00.650829" elapsed="0.000413"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.652138" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:00.652213" 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-07T17:20:00.651837" elapsed="0.000400"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.652393" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.653581" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:00.963374" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:00 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:00.653267" elapsed="0.310196"/>
</kw>
<msg time="2026-04-07T17:20:00.963523" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.652897" elapsed="0.310682"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:00.651449" elapsed="0.312215"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.964046" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:20:00.976601" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:20:00.976933" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:00.977076" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:00.963842" elapsed="0.013289"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:00.977486" elapsed="0.000874"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.979383" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:00.978744" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:00.979909" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:00.979647" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.979600" elapsed="0.000500"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:00.980456" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:20:00.980219" elapsed="0.000366"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.980185" elapsed="0.000452"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:00.980712" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.985410" elapsed="0.000308"/>
</kw>
<kw name="Open 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-07T17:20:00.985876" elapsed="0.000165"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:00.986187" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:00.981408" elapsed="0.004925"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:00.648786" elapsed="0.337636"/>
</kw>
<msg time="2026-04-07T17:20:00.986474" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.648214" elapsed="0.338306"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:00.647690" elapsed="0.338906"/>
</kw>
<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-07T17:20:00.988662" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:00.988397" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:00.988377" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.989037" 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-07T17:20:00.989139" 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-07T17:20:00.988889" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.989699" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:20:00.989313" elapsed="0.000431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.990273" level="INFO">${conn_id} = 489</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-07T17:20:00.989897" elapsed="0.000401"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:00.991189" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:00.991265" 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-07T17:20:00.990902" elapsed="0.000387"/>
</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-07T17:20:00.991441" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:00.992634" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:01.311384" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:00 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:00.992323" elapsed="0.319221"/>
</kw>
<msg time="2026-04-07T17:20:01.311611" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.991956" elapsed="0.319717"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:00.990512" elapsed="0.321253"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.312146" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:20:01.324451" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:20:01.324692" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:01.324788" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:01.311944" elapsed="0.012895"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.325239" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.326722" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:01.326132" elapsed="0.000689"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.327281" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.327017" elapsed="0.000369"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.326935" elapsed="0.000501"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:01.327781" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:20:01.327552" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.327519" elapsed="0.000476"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.328076" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.332670" elapsed="0.000456"/>
</kw>
<kw name="Open 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-07T17:20:01.333349" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.333759" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:01.328730" elapsed="0.005240"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:00.987860" elapsed="0.346271"/>
</kw>
<msg time="2026-04-07T17:20:01.334207" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:00.987296" elapsed="0.346979"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:00.986786" elapsed="0.347601"/>
</kw>
<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-07T17:20:01.337254" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.336865" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.336839" elapsed="0.000526"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.337747" 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-07T17:20:01.337885" 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-07T17:20:01.337567" elapsed="0.000354"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.338655" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:20:01.338183" elapsed="0.000519"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.339229" level="INFO">${conn_id} = 491</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-07T17:20:01.338855" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.340137" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:01.340213" 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-07T17:20:01.339851" elapsed="0.000385"/>
</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-07T17:20:01.340437" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.341607" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:01.674956" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:01 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:01.341296" elapsed="0.333851"/>
</kw>
<msg time="2026-04-07T17:20:01.675238" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.340925" elapsed="0.334403"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:01.339463" elapsed="0.335991"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.676062" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:20:01.688318" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:20:01.688592" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:01.688690" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:01.675741" elapsed="0.013000"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.689143" elapsed="0.000472"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.690751" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:01.690076" elapsed="0.000775"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.691394" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.691072" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.691011" elapsed="0.000567"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:01.691931" elapsed="0.000090"/>
</return>
<status status="PASS" start="2026-04-07T17:20:01.691698" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.691664" elapsed="0.000491"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.692233" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.696780" elapsed="0.000476"/>
</kw>
<kw name="Open 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-07T17:20:01.697538" elapsed="0.000244"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.698023" elapsed="0.000153"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:01.693043" elapsed="0.005209"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:01.336137" elapsed="0.362263"/>
</kw>
<msg time="2026-04-07T17:20:01.698504" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.335363" elapsed="0.363231"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:01.334655" elapsed="0.364079"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:20:00.038003" elapsed="1.660820"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:19:59.735164" elapsed="1.963848"/>
</test>
<test id="s1-s2-s1-t21" name="Add Tap Device Manually and Verify After Fail" line="111">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:01.703134" elapsed="0.000215"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:01.702856" 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-07T17:20:01.704752" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.704351" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.704329" elapsed="0.000500"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.709538" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.709408" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.709386" elapsed="0.000220"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.710675" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:01.710244" elapsed="0.000457"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.711184" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:01.710858" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:01.711254" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:01.711406" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:01.709846" elapsed="0.001585"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.716920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.716789" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.716712" elapsed="0.000297"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.718256" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.718149" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.718131" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:01.718859" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:01.718465" elapsed="0.000420"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.719350" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:01.719072" elapsed="0.000304"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.753032" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:01.719922" elapsed="0.033326"/>
</kw>
<msg time="2026-04-07T17:20:01.753437" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:01.753484" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.719534" elapsed="0.033986"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.823421" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:01.754134" elapsed="0.069484"/>
</kw>
<msg time="2026-04-07T17:20:01.823788" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:01.823835" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.753702" elapsed="0.070170"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.824206" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.823951" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.823931" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.824877" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:01.824475" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.825271" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.825055" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.825036" elapsed="0.000391"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:01.825468" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.828059" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:20:01.829566" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.830995" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:01.826469" elapsed="0.004936"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:01.825774" elapsed="0.005746"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:01.717825" elapsed="0.113796"/>
</kw>
<msg time="2026-04-07T17:20:01.831715" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:01.831761" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.717162" elapsed="0.114636"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:01.832002" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:01.831875" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.831856" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.832503" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.832832" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.832904" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:01.716388" elapsed="0.116653"/>
</kw>
<msg time="2026-04-07T17:20:01.833135" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:01.833178" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.711823" elapsed="0.121391"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.833548" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.833289" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.833272" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:01.711681" elapsed="0.121968"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.839114" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.839001" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.838964" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.840419" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.840304" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.840281" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:01.841100" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:01.840631" elapsed="0.000498"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.841555" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:01.841285" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.872574" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:01.842187" elapsed="0.030550"/>
</kw>
<msg time="2026-04-07T17:20:01.872913" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:01.872960" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.841777" elapsed="0.031242"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.934913" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:01.873637" elapsed="0.061530"/>
</kw>
<msg time="2026-04-07T17:20:01.935357" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:01.935406" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.873194" elapsed="0.062253"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.935774" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.935531" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.935510" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:01.936426" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:01.936048" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.936793" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.936581" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.936563" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:01.936924" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:01.939280" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:01.940729" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:01.942139" elapsed="0.000344"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:01.937775" elapsed="0.004779"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:01.937203" elapsed="0.005465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:01.839989" elapsed="0.102780"/>
</kw>
<msg time="2026-04-07T17:20:01.942859" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:01.942904" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.839346" elapsed="0.103595"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:01.943143" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:01.943035" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.943015" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.943607" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.943935" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.944037" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:01.838636" elapsed="0.105510"/>
</kw>
<msg time="2026-04-07T17:20:01.944238" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:01.944282" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.833909" elapsed="0.110410"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:01.944643" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:01.944393" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.944375" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:01.833773" elapsed="0.110969"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.950324" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.950215" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.950195" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:01.951611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:01.951504" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:01.951486" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:01.952230" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:01.951856" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.952654" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:01.952408" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:01.985130" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:01.953244" elapsed="0.032056"/>
</kw>
<msg time="2026-04-07T17:20:01.985479" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:01.985527" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.952841" elapsed="0.032723"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.042834" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:01.986152" elapsed="0.056915"/>
</kw>
<msg time="2026-04-07T17:20:02.043238" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.043283" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.985734" elapsed="0.057586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.043617" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.043396" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.043377" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.044264" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.043859" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.044628" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.044417" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.044399" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.044759" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.047163" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:20:02.048618" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.050039" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.045626" elapsed="0.004806"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.045028" elapsed="0.005522"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:01.951203" elapsed="0.099447"/>
</kw>
<msg time="2026-04-07T17:20:02.050740" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.050783" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.950558" elapsed="0.100262"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.051088" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.050933" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.050914" elapsed="0.000259"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.051553" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.051924" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.052025" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:01.949848" elapsed="0.102289"/>
</kw>
<msg time="2026-04-07T17:20:02.052230" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.052273" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.945163" elapsed="0.107147"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.052632" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.052385" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.052368" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:01.944901" elapsed="0.107834"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:01.711494" elapsed="0.341273"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:01.709037" elapsed="0.343787"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:01.704049" elapsed="0.348831"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:01.703582" elapsed="0.349343"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:01.700302" elapsed="0.352719"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:02.062952" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.059165" elapsed="0.003839">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:01.699338" elapsed="0.363829">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t22" name="Delete the Bridge Manually and Verify After Fail" line="115">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:02.066192" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:02.065919" 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-07T17:20:02.067443" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.067331" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.067312" 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-07T17:20:02.072089" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.071966" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.071948" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.073142" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:02.072745" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.073625" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:02.073324" elapsed="0.000326"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:02.073694" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:02.073846" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:02.072373" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.079189" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.079079" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.079060" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.080470" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.080364" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.080346" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.081047" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.080675" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.081492" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.081226" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.111709" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.082114" elapsed="0.029785"/>
</kw>
<msg time="2026-04-07T17:20:02.112097" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.112143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.081685" elapsed="0.030495"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.173632" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.112744" elapsed="0.061089"/>
</kw>
<msg time="2026-04-07T17:20:02.174028" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.174076" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.112356" elapsed="0.061757"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.174425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.174195" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.174174" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.175063" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.174665" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.175433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.175221" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.175202" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.175566" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.177916" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.179351" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.180760" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.176439" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.175828" elapsed="0.005461"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.080065" elapsed="0.101325"/>
</kw>
<msg time="2026-04-07T17:20:02.181480" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.181523" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.079427" elapsed="0.102133"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.181807" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.181698" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.181678" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.182330" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.182655" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.182725" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.078720" elapsed="0.104112"/>
</kw>
<msg time="2026-04-07T17:20:02.182925" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.182972" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.074248" elapsed="0.108775"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.183343" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.183099" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.183082" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:02.074111" elapsed="0.109332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.189909" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.189800" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.189782" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.191191" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.191085" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.191067" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.191751" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.191398" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.192210" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.191930" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.222206" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.192771" elapsed="0.029597"/>
</kw>
<msg time="2026-04-07T17:20:02.222536" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.222582" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.192392" elapsed="0.030226"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.290674" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.223191" elapsed="0.067703"/>
</kw>
<msg time="2026-04-07T17:20:02.291100" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.291146" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.222785" elapsed="0.068397"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.291498" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.291260" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.291240" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.292227" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.291770" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.292661" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.292447" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.292427" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.292821" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.295156" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:20:02.296601" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.298017" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.293685" elapsed="0.004726"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.293115" elapsed="0.005409"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.190760" elapsed="0.107862"/>
</kw>
<msg time="2026-04-07T17:20:02.298713" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.298756" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.190145" elapsed="0.108648"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.298992" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.298870" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.298851" elapsed="0.000227"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.299453" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.299777" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.299848" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.189459" elapsed="0.110496"/>
</kw>
<msg time="2026-04-07T17:20:02.300081" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.300125" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.183698" elapsed="0.116464"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.300487" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.300237" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.300220" elapsed="0.000345"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:02.183564" elapsed="0.117023"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.306031" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.305905" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.305886" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.307392" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.307287" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.307269" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.307951" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.307597" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.308403" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.308153" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.342472" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.309001" elapsed="0.033627"/>
</kw>
<msg time="2026-04-07T17:20:02.342839" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.342886" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.308581" elapsed="0.034342"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.409730" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.343491" elapsed="0.066620"/>
</kw>
<msg time="2026-04-07T17:20:02.410380" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.410429" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.343109" elapsed="0.067357"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.410998" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.410609" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.410561" elapsed="0.000555"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.411778" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.411266" elapsed="0.000606"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.412172" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.411940" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.411921" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.412312" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.414929" elapsed="0.000671"/>
</kw>
<kw name="Open 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-07T17:20:02.416622" elapsed="0.000519"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.418095" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.413341" elapsed="0.005156"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.412670" elapsed="0.005941"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.306872" elapsed="0.111842"/>
</kw>
<msg time="2026-04-07T17:20:02.418814" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.418859" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.306259" elapsed="0.112638"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.419157" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.419045" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.418957" elapsed="0.000285"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.419664" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.420038" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.420113" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.305513" elapsed="0.114714"/>
</kw>
<msg time="2026-04-07T17:20:02.420325" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.420369" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.300867" elapsed="0.119544"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.420888" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.420624" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.420605" elapsed="0.000364"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:02.300708" elapsed="0.120302"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:02.073923" elapsed="0.347127"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:02.071610" elapsed="0.349508"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:02.067022" elapsed="0.354162"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.066597" elapsed="0.354638"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:02.063942" elapsed="0.357354"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:02.429647" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.425790" elapsed="0.003898">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.063385" elapsed="0.366466">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t23" name="Create Bridge In Owner and Verify After Fail" line="119">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:02.433174" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:02.432896" 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-07T17:20:02.434441" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.434331" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.434312" 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-07T17:20:02.439090" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.438967" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.438946" elapsed="0.000213"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.440161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:02.439757" elapsed="0.000431"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.440645" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:02.440344" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:02.440715" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:02.440866" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:02.439381" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.446196" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.446089" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.446070" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.447460" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.447353" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.447335" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.448056" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.447676" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.448493" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.448238" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.482590" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.449074" elapsed="0.033691"/>
</kw>
<msg time="2026-04-07T17:20:02.482931" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.483015" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.448675" elapsed="0.034511"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.543944" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.483799" elapsed="0.060407"/>
</kw>
<msg time="2026-04-07T17:20:02.544415" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.544461" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.483394" elapsed="0.061110"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.544883" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.544608" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.544575" elapsed="0.000436"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.545580" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.545159" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.545947" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.545736" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.545718" elapsed="0.000350"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.546114" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.548573" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:20:02.550049" elapsed="0.000533"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.551527" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.547075" elapsed="0.004856"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.546440" elapsed="0.005626"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.447055" elapsed="0.105114"/>
</kw>
<msg time="2026-04-07T17:20:02.552263" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.552308" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.446408" elapsed="0.105938"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.552530" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.552424" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.552405" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.553031" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.553369" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.553440" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.445738" elapsed="0.107812"/>
</kw>
<msg time="2026-04-07T17:20:02.553644" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.553687" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.441287" elapsed="0.112440"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.554068" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.553804" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.553787" elapsed="0.000412"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:02.441147" elapsed="0.113076"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.559808" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.559699" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.559680" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.561078" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.560953" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.560935" elapsed="0.000210"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.561644" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.561284" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.562091" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.561821" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.591433" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.562671" elapsed="0.028939"/>
</kw>
<msg time="2026-04-07T17:20:02.591775" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.591821" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.562272" elapsed="0.029586"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.650015" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.592505" elapsed="0.057699"/>
</kw>
<msg time="2026-04-07T17:20:02.650370" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.650415" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.592118" elapsed="0.058333"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.650743" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.650528" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.650508" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.651427" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.651045" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.651790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.651580" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.651561" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.651920" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.654231" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.655676" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.657082" elapsed="0.000312"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.652779" elapsed="0.004694"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.652202" elapsed="0.005383"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.560653" elapsed="0.097030"/>
</kw>
<msg time="2026-04-07T17:20:02.657774" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.657856" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.560041" elapsed="0.097854"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.658102" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.657992" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.657954" elapsed="0.000231"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.658560" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.658885" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.658986" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.559351" elapsed="0.099752"/>
</kw>
<msg time="2026-04-07T17:20:02.659207" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.659250" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.554517" elapsed="0.104769"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.659604" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.659360" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.659343" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:02.554376" elapsed="0.105327"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.665190" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.664924" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.664906" elapsed="0.000352"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.666453" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.666348" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.666330" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.667034" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.666657" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.667467" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.667214" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.699139" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.668044" elapsed="0.031275"/>
</kw>
<msg time="2026-04-07T17:20:02.699487" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.699532" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.667647" elapsed="0.031921"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.756462" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.700146" elapsed="0.056509"/>
</kw>
<msg time="2026-04-07T17:20:02.756824" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.756869" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.699736" elapsed="0.057169"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.757229" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.757007" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.756961" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.757888" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "n "e "r "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.757477" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.758276" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.758063" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.758044" elapsed="0.000339"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.758415" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.760722" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:20:02.762173" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.763556" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.759260" elapsed="0.004704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.758672" elapsed="0.005425"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.666048" elapsed="0.098153"/>
</kw>
<msg time="2026-04-07T17:20:02.764294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.764337" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.665412" elapsed="0.098962"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.764557" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.764450" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.764432" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.765037" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.765362" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.765432" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.664587" elapsed="0.100956"/>
</kw>
<msg time="2026-04-07T17:20:02.765634" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.765677" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.659959" elapsed="0.105755"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.766048" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.765789" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.765771" elapsed="0.000355"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:02.659824" elapsed="0.106325"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:02.440948" elapsed="0.325230"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:02.438607" elapsed="0.327631"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:02.434043" elapsed="0.332254"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.433601" elapsed="0.332745"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:02.430656" elapsed="0.335747"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:02.778188" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.774385" elapsed="0.003844">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.430095" elapsed="0.348296">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t24" name="Create Port In Owner and Verify After Fail" line="123">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:02.781934" elapsed="0.000227"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:02.781678" 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-07T17:20:02.783190" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.783077" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.783057" 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-07T17:20:02.787833" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.787704" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.787687" elapsed="0.000231"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.788904" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:02.788525" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.789451" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:02.789138" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:02.789521" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:02.789674" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:02.788153" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.795062" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.794931" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.794913" elapsed="0.000217"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.796343" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.796235" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.796217" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.796904" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.796548" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.797365" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.797105" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.826753" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.797922" elapsed="0.028988"/>
</kw>
<msg time="2026-04-07T17:20:02.827126" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.827173" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.797545" elapsed="0.029664"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.885702" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.827779" elapsed="0.058142"/>
</kw>
<msg time="2026-04-07T17:20:02.886121" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.886168" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.827394" elapsed="0.058811"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.886512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.886286" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.886266" elapsed="0.000348"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:02.887153" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.886752" elapsed="0.000526"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.887562" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.887348" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.887329" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:02.887696" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:02.890145" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:20:02.891626" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:02.893110" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:02.888619" elapsed="0.004899"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:02.887956" elapsed="0.005682"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.795907" elapsed="0.097833"/>
</kw>
<msg time="2026-04-07T17:20:02.893835" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.893882" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.795276" elapsed="0.098644"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:02.894134" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:02.894023" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.894002" elapsed="0.000219"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.894620" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.894958" elapsed="0.000056"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.895065" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.794590" elapsed="0.100587"/>
</kw>
<msg time="2026-04-07T17:20:02.895273" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:02.895320" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.790079" elapsed="0.105279"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.895684" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.895435" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.895416" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:02.789926" elapsed="0.105889"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.901369" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.901258" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.901238" elapsed="0.000203"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:02.902661" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:02.902552" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.902533" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:02.903357" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:02.902872" elapsed="0.000513"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.903802" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:02.903542" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.934243" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:02.904399" elapsed="0.030023"/>
</kw>
<msg time="2026-04-07T17:20:02.934638" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:02.934688" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.904005" elapsed="0.030722"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:02.998841" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:02.935350" elapsed="0.063710"/>
</kw>
<msg time="2026-04-07T17:20:02.999234" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:02.999280" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.934898" elapsed="0.064418"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:02.999618" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:02.999397" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:02.999376" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.000264" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:02.999857" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.000624" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.000416" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.000398" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.000757" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.003111" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:20:03.004556" elapsed="0.000492"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.005948" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.001645" elapsed="0.004729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.001037" elapsed="0.005450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:02.902242" elapsed="0.104350"/>
</kw>
<msg time="2026-04-07T17:20:03.006688" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.006734" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.901590" elapsed="0.105181"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.006958" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.006850" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.006830" elapsed="0.000233"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.007453" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.007785" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.007858" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:02.900876" elapsed="0.107094"/>
</kw>
<msg time="2026-04-07T17:20:03.008094" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.008139" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.896115" elapsed="0.112061"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.008543" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.008293" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.008273" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:02.895949" elapsed="0.112696"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.014178" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.014069" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.014050" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.015452" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.015345" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.015327" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.016056" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.015656" elapsed="0.000426"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.016484" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.016233" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.048538" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.017073" elapsed="0.031629"/>
</kw>
<msg time="2026-04-07T17:20:03.048872" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.048918" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.016663" elapsed="0.032292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.103866" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.049557" elapsed="0.054526"/>
</kw>
<msg time="2026-04-07T17:20:03.104257" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.104302" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.049144" elapsed="0.055194"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.104639" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.104416" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.104396" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.105276" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "a "n "[78Cd "[A[78C
 "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.104887" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.105643" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.105428" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.105410" elapsed="0.000362"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.105805" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.108076" elapsed="0.000501"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.109487" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.110861" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.106648" elapsed="0.004615"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.106081" elapsed="0.005292"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.015039" elapsed="0.096433"/>
</kw>
<msg time="2026-04-07T17:20:03.111604" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.111647" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.014393" elapsed="0.097292"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.111869" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.111761" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.111743" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.112348" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.112676" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.112746" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.013710" elapsed="0.099142"/>
</kw>
<msg time="2026-04-07T17:20:03.112943" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.113019" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.008908" elapsed="0.104151"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.113378" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.113136" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.113118" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:03.008771" elapsed="0.104707"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:02.789754" elapsed="0.323753"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:02.787329" elapsed="0.326238"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:02.782773" elapsed="0.330852"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:02.782359" elapsed="0.331312"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:02.779683" elapsed="0.334042"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:03.127150" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:03.123655" elapsed="0.003533">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:02.779003" elapsed="0.348378">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t25" name="Modify the destination IP of Port In Owner After Fail" line="127">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:03.131158" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:03.130882" 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-07T17:20:03.132392" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.132281" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.132263" 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-07T17:20:03.137012" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.136874" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.136856" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.138143" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:03.137705" elapsed="0.000464"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.138625" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:03.138323" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:03.138693" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:03.138844" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:03.137318" elapsed="0.001550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.144074" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.143949" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.143931" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.145317" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.145213" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.145196" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.145868" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.145520" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.146350" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.146099" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.176949" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.146906" elapsed="0.030225"/>
</kw>
<msg time="2026-04-07T17:20:03.177302" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.177347" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.146531" elapsed="0.030893"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.237071" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.178080" elapsed="0.059189"/>
</kw>
<msg time="2026-04-07T17:20:03.237438" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.237483" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.177601" elapsed="0.059917"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.237810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.237595" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.237575" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.238447" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.238077" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.238830" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.238622" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.238604" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.238961" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.241254" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.242728" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.244137" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.239800" elapsed="0.004729"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.239231" elapsed="0.005410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.144892" elapsed="0.099847"/>
</kw>
<msg time="2026-04-07T17:20:03.244829" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.244872" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.144285" elapsed="0.100657"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.245146" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.245039" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.245019" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.245608" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.245932" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.246033" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.143616" elapsed="0.102526"/>
</kw>
<msg time="2026-04-07T17:20:03.246233" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.246275" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.139286" elapsed="0.107025"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.246639" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.246385" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.246368" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:03.139151" elapsed="0.107593"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.252048" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.251921" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.251902" elapsed="0.000214"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.253290" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.253185" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.253167" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.253845" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.253493" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.254289" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.254039" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.284643" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.254863" elapsed="0.029940"/>
</kw>
<msg time="2026-04-07T17:20:03.285011" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.285061" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.254469" elapsed="0.030628"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.353544" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.285646" elapsed="0.068121"/>
</kw>
<msg time="2026-04-07T17:20:03.353948" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.354017" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.285263" elapsed="0.068793"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.354382" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.354142" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.354119" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.355040" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.354627" elapsed="0.001137"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.356073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.355837" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.355817" elapsed="0.000359"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.356210" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.358558" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:20:03.360031" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.361409" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.357097" elapsed="0.004707"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.356489" elapsed="0.005427"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.252867" elapsed="0.109167"/>
</kw>
<msg time="2026-04-07T17:20:03.362128" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.362173" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.252261" elapsed="0.109950"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.362394" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.362288" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.362269" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.362862" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.363268" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.363345" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.251585" elapsed="0.111871"/>
</kw>
<msg time="2026-04-07T17:20:03.363549" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.363594" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.247123" elapsed="0.116507"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.363949" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.363705" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.363688" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:03.246864" elapsed="0.117204"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.369480" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.369373" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.369354" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.370730" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.370624" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.370607" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.371440" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.370934" elapsed="0.000535"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.371876" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.371624" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.401438" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.372457" elapsed="0.029155"/>
</kw>
<msg time="2026-04-07T17:20:03.401826" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.401873" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.372075" elapsed="0.029835"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.481023" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.402489" elapsed="0.078759"/>
</kw>
<msg time="2026-04-07T17:20:03.481428" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.481474" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.402098" elapsed="0.079413"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.481827" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.481595" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.481572" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.482515" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.482122" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.482891" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.482678" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.482659" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.483044" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.485412" elapsed="0.000515"/>
</kw>
<kw name="Open 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-07T17:20:03.486844" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.488270" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.483950" elapsed="0.004716"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.483317" elapsed="0.005463"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.370319" elapsed="0.118564"/>
</kw>
<msg time="2026-04-07T17:20:03.488994" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.489041" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.369694" elapsed="0.119385"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.489266" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.489157" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.489138" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.489737" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.490089" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.490164" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.369030" elapsed="0.121243"/>
</kw>
<msg time="2026-04-07T17:20:03.490366" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.490410" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.364335" elapsed="0.126112"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.490813" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.490564" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.490545" elapsed="0.000346"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:03.364199" elapsed="0.126715"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:03.138961" elapsed="0.351985"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:03.136515" elapsed="0.354513"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:03.131996" elapsed="0.359094"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.131569" elapsed="0.359571"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:03.128566" elapsed="0.362631"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:03.499082" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:20:03.495536" elapsed="0.003586">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:20:03.127883" elapsed="0.371395">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t26" name="Verify Port Is Modified After Fail" 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-07T17:20:03.502625" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:03.502368" 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-07T17:20:03.503893" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.503784" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.503766" 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-07T17:20:03.508546" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.508440" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.508423" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.509612" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:03.509230" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.510121" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:03.509796" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:03.510191" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:03.510345" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:03.508836" elapsed="0.001533"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.516307" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.516178" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.516156" elapsed="0.000230"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.517792" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.517663" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.517643" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.518506" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.518080" elapsed="0.000460"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.519031" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.518717" elapsed="0.000344"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.552101" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.519674" elapsed="0.032613"/>
</kw>
<msg time="2026-04-07T17:20:03.552468" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.552515" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.519241" elapsed="0.033523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.602297" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.553387" elapsed="0.049103"/>
</kw>
<msg time="2026-04-07T17:20:03.602660" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.602706" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.552951" elapsed="0.049792"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.603091" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.602829" elapsed="0.000340"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.602805" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.603718" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.603338" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.604100" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.603870" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.603852" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.604236" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.606674" elapsed="0.000538"/>
</kw>
<kw name="Open 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-07T17:20:03.608136" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.609560" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.605185" elapsed="0.004774"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.604561" elapsed="0.005539"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.517330" elapsed="0.092872"/>
</kw>
<msg time="2026-04-07T17:20:03.610297" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.610341" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.516559" elapsed="0.093819"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.610566" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.610457" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.610437" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.611069" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.611407" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.611479" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.515727" elapsed="0.095863"/>
</kw>
<msg time="2026-04-07T17:20:03.611686" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.611730" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.510733" elapsed="0.101034"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.612109" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.611845" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.611828" elapsed="0.000400"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:03.510596" elapsed="0.101657"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.617952" elapsed="0.000090"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.617843" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.617825" elapsed="0.000274"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.619296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.619189" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.619171" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.619863" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.619507" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.620316" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.620062" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.657396" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.620909" elapsed="0.036845"/>
</kw>
<msg time="2026-04-07T17:20:03.658162" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.658265" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.620499" elapsed="0.037849"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.711726" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.659614" elapsed="0.052302"/>
</kw>
<msg time="2026-04-07T17:20:03.712107" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.712153" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.658719" elapsed="0.053470"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.712485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.712267" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.712247" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.713129" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.712725" elapsed="0.000488"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.713497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.713281" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.713263" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.713628" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.715913" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:20:03.717388" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.718765" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.714469" elapsed="0.004704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.713877" elapsed="0.005410"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.618853" elapsed="0.100533"/>
</kw>
<msg time="2026-04-07T17:20:03.719477" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.719520" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.618246" elapsed="0.101360"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.719798" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.719688" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.719669" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.720281" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.720613" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.720684" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.617499" elapsed="0.103293"/>
</kw>
<msg time="2026-04-07T17:20:03.720884" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.720928" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.612532" elapsed="0.108436"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.721345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.721071" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.721053" elapsed="0.000372"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:03.612392" elapsed="0.109057"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.726740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.726633" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.726614" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.728155" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.728033" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.728015" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.728715" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.728360" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.729523" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.728891" elapsed="0.000659"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.760169" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.730115" elapsed="0.030214"/>
</kw>
<msg time="2026-04-07T17:20:03.760497" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.760543" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.729708" elapsed="0.030871"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.815831" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.761159" elapsed="0.055049"/>
</kw>
<msg time="2026-04-07T17:20:03.816484" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.816533" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.760745" elapsed="0.055826"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.817113" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.816714" elapsed="0.000487"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.816666" elapsed="0.000566"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.817927" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.817383" elapsed="0.000751"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.818425" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.818206" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.818186" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.818567" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.821157" elapsed="0.000571"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.822734" elapsed="0.000543"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.824281" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.819590" elapsed="0.005104"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.818908" elapsed="0.005901"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.727716" elapsed="0.097197"/>
</kw>
<msg time="2026-04-07T17:20:03.825049" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.825097" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.726955" elapsed="0.098180"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.825329" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.825218" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.825199" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.825863" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.826231" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.826305" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.726289" elapsed="0.100128"/>
</kw>
<msg time="2026-04-07T17:20:03.826516" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.826561" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.721711" elapsed="0.104890"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.826929" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.826679" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.826662" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:03.721577" elapsed="0.105478"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:03.510424" elapsed="0.316667"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:03.508085" elapsed="0.319071"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:03.503497" elapsed="0.323724"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.503047" elapsed="0.324223"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:03.500382" elapsed="0.326947"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:03.835908" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:03.831816" elapsed="0.004133">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:03.499594" elapsed="0.336530">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s1-t27" name="Start Old Owner Instance" line="135">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:03.840011" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:03.839733" 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-07T17:20:03.841337" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.841226" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.841207" 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-07T17:20:03.845960" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.845851" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.845813" elapsed="0.000230"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.847050" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:03.846644" elapsed="0.000433"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.847537" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:03.847233" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:03.847607" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:03.847759" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:03.846266" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.853037" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.852912" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.852893" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.854321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.854213" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.854195" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.854893" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.854529" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.855356" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.855095" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.886902" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.855920" elapsed="0.031202"/>
</kw>
<msg time="2026-04-07T17:20:03.887289" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.887334" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.855541" elapsed="0.031830"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.937791" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.887927" elapsed="0.050070"/>
</kw>
<msg time="2026-04-07T17:20:03.938170" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:03.938215" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.887535" elapsed="0.050717"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.938572" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.938328" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.938309" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:03.939210" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:03.938816" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.939568" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.939356" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.939337" elapsed="0.000381"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:03.939753" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:03.942249" elapsed="0.000722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.944517" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:03.945938" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:03.940653" elapsed="0.005702"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:03.940064" elapsed="0.006444"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.853887" elapsed="0.092725"/>
</kw>
<msg time="2026-04-07T17:20:03.946703" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.946747" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.853254" elapsed="0.093529"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:03.946967" elapsed="0.000044"/>
</return>
<status status="PASS" start="2026-04-07T17:20:03.946860" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.946841" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.947465" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.947798" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.947869" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.852574" elapsed="0.095494"/>
</kw>
<msg time="2026-04-07T17:20:03.948166" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:03.948209" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.848179" elapsed="0.100067"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:03.948564" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:03.948319" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.948302" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:03.848038" elapsed="0.100625"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.954017" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.953893" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.953874" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:03.955296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:03.955189" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:03.955172" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:03.955855" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:03.955499" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.956328" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:03.956074" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:03.987507" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:03.956901" elapsed="0.030780"/>
</kw>
<msg time="2026-04-07T17:20:03.987847" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:03.987893" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.956506" elapsed="0.031423"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.035389" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:03.988554" elapsed="0.047031"/>
</kw>
<msg time="2026-04-07T17:20:04.035759" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:04.035806" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.988151" elapsed="0.047691"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.036172" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.035921" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.035901" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.036839" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.036417" elapsed="0.000503"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.037226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.037011" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.036990" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:04.037360" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.039682" elapsed="0.000707"/>
</kw>
<kw name="Open 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-07T17:20:04.041329" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:04.042718" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.038216" elapsed="0.004919"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:04.037614" elapsed="0.005631"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:03.954871" elapsed="0.088474"/>
</kw>
<msg time="2026-04-07T17:20:04.043436" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.043479" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.954231" elapsed="0.089285"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:04.043699" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.043593" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.043574" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.044181" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.044509" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.044579" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:03.953550" elapsed="0.091137"/>
</kw>
<msg time="2026-04-07T17:20:04.044779" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.044822" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.948922" elapsed="0.095936"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.045220" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.044931" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.044914" elapsed="0.000385"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:03.948786" elapsed="0.096535"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.051317" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.051206" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.051187" elapsed="0.000200"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.052664" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.052556" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.052538" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.053243" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.052869" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.053672" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:04.053420" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.084014" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:04.054247" elapsed="0.029928"/>
</kw>
<msg time="2026-04-07T17:20:04.084343" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:04.084389" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.053849" elapsed="0.030577"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.130276" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:04.084991" elapsed="0.045471"/>
</kw>
<msg time="2026-04-07T17:20:04.130636" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:04.130681" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.084591" elapsed="0.046127"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.131042" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.130795" elapsed="0.000324"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.130775" elapsed="0.000369"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.131672" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "t "a "r "t "[C "O "l "d "[C "O "w "n "e "r "[C "I "n "s "t "a "n "c "[78Ce "[A[78C"[K
[K
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.131286" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.132047" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.131818" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.131799" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:04.132180" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.134414" elapsed="0.000498"/>
</kw>
<kw name="Open 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-07T17:20:04.135865" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:04.137248" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.133008" elapsed="0.004623"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:04.132428" elapsed="0.005313"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:04.052254" elapsed="0.085586"/>
</kw>
<msg time="2026-04-07T17:20:04.137930" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.137989" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.051531" elapsed="0.086497"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:04.138260" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.138151" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.138131" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.138720" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.139065" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.139137" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:04.050821" elapsed="0.088422"/>
</kw>
<msg time="2026-04-07T17:20:04.139335" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.139378" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.045617" elapsed="0.093798"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.139848" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.139593" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.139572" elapsed="0.000353"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:04.045483" elapsed="0.094465"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:03.847842" elapsed="0.292167"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:03.845473" elapsed="0.294596"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:03.840912" elapsed="0.299214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:03.840475" elapsed="0.299699"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:03.837413" elapsed="0.302851"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:20:04.146387" 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-07T17:20:04.140501" elapsed="0.005925">Variable '${original_owner}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-04-07T17:20:03.836768" elapsed="0.309811">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t28" name="Check Shards Status After Recover" line="139">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:04.150345" elapsed="0.000214"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:04.150080" 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-07T17:20:04.151605" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.151465" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.151447" elapsed="0.000225"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.156193" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.156088" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.156071" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.157234" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.156840" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.157736" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:04.157414" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:04.157805" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:04.157957" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:04.156474" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.163205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.163099" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.163079" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.164532" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.164426" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.164408" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.165103" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.164735" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.165528" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:04.165282" elapsed="0.000271"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.197194" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:04.166098" elapsed="0.031270"/>
</kw>
<msg time="2026-04-07T17:20:04.197534" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:04.197579" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.165706" elapsed="0.031909"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.255890" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:04.198235" elapsed="0.057903"/>
</kw>
<msg time="2026-04-07T17:20:04.256306" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:04.256352" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.197780" elapsed="0.058608"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.256689" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.256467" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.256446" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.257323" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.256931" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.257684" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.257473" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.257455" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:04.257815" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.260114" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:20:04.261530" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:04.262890" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.258656" elapsed="0.004636"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:04.258087" elapsed="0.005318"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:04.164126" elapsed="0.099378"/>
</kw>
<msg time="2026-04-07T17:20:04.263595" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.263638" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.163457" elapsed="0.100218"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:04.263857" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.263751" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.263732" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.264380" elapsed="0.000061"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.264746" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.264818" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:04.162745" elapsed="0.102180"/>
</kw>
<msg time="2026-04-07T17:20:04.265036" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.265080" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.158364" elapsed="0.106754"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.265440" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.265194" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.265176" elapsed="0.000344"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:04.158229" elapsed="0.107316"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.270834" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.270728" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.270709" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.272294" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.272183" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.272137" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.272851" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.272500" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.273298" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:04.273048" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.304142" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:04.273854" elapsed="0.030490"/>
</kw>
<msg time="2026-04-07T17:20:04.304513" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:04.304559" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.273479" elapsed="0.031116"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.353182" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:04.305160" elapsed="0.048208"/>
</kw>
<msg time="2026-04-07T17:20:04.353532" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:04.353578" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.304759" elapsed="0.048855"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.353904" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.353689" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.353670" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.354543" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.354168" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.354937" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.354725" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.354703" elapsed="0.000395"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:04.355131" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.357434" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:20:04.358862" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:04.360292" elapsed="0.000356"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.355944" elapsed="0.004777"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:04.355378" elapsed="0.005457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:04.271699" elapsed="0.089236"/>
</kw>
<msg time="2026-04-07T17:20:04.361057" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.361101" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.271065" elapsed="0.090073"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:04.361320" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.361215" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.361197" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.361779" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.362123" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.362196" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:04.270389" elapsed="0.091913"/>
</kw>
<msg time="2026-04-07T17:20:04.362393" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.362436" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.265801" elapsed="0.096671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.362789" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.362546" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.362529" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:04.265667" elapsed="0.097220"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.368174" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.368066" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.368047" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.369468" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.369362" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.369344" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.370159" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.369673" elapsed="0.000512"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.370589" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:04.370338" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.398929" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:04.371168" elapsed="0.027943"/>
</kw>
<msg time="2026-04-07T17:20:04.399278" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:04.399324" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.370768" elapsed="0.028592"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:04.445262" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:04.399958" elapsed="0.045501"/>
</kw>
<msg time="2026-04-07T17:20:04.445635" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:04.445682" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.399571" elapsed="0.046149"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.446049" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.445799" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.445779" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.446672" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[C "A "f "t "[78Ce "[A[78Cr
 "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.446293" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.447056" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.446824" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.446806" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:04.447190" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.449534" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:20:04.451008" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:04.452429" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.448054" elapsed="0.004775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:04.447441" elapsed="0.005504"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:04.369063" elapsed="0.084025"/>
</kw>
<msg time="2026-04-07T17:20:04.453330" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.453377" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.368387" elapsed="0.085028"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:04.453602" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.453494" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.453475" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.454088" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.454420" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.454493" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:04.367688" elapsed="0.086917"/>
</kw>
<msg time="2026-04-07T17:20:04.454698" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:04.454742" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.363156" elapsed="0.091623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.455115" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.454853" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.454836" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:04.363023" elapsed="0.092194"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:04.158057" elapsed="0.297221"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:04.155717" elapsed="0.299619"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:04.151183" elapsed="0.304209"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:04.150756" elapsed="0.304681"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:04.147746" elapsed="0.307744"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:20:04.476544" elapsed="0.000224"/>
</kw>
<msg time="2026-04-07T17:20:04.476816" 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-07T17:20:04.475907" elapsed="0.000960"/>
</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 [['topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.475452" elapsed="0.001492"/>
</kw>
<msg time="2026-04-07T17:20:04.477008" 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-07T17:20:04.467459" elapsed="0.009594"/>
</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-07T17:20:04.467068" elapsed="0.010059"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.477559" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.477307" 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-07T17:20:04.482576" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.482193" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.483084" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:04.482759" elapsed="0.000352"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:04.483156" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:04.483310" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:04.481803" 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-07T17:20:04.483486" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.484147" 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-07T17:20:04.483796" elapsed="0.000378"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.484570" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:04.484328" elapsed="0.000268"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.484992" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:04.484739" elapsed="0.000280"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.489292" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.488640" elapsed="0.000703"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:04.489404" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:04.489737" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.487295" elapsed="0.002502"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.535863" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.535482" elapsed="0.000446"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.536706" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.536446" elapsed="0.000335">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.536876" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.536109" elapsed="0.000792"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.537514" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.537079" elapsed="0.000464"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.537843" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:04.538025" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:04.537704" elapsed="0.000348"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.538448" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.538205" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.539599" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.539342" elapsed="0.000303"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.540091" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.539802" elapsed="0.000315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.540432" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.540634" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.540801" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.540303" elapsed="0.000555"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.540164" elapsed="0.000723"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:04.540929" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:04.541103" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:04.539017" elapsed="0.002111"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.538561" elapsed="0.002600"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.541326" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.541185" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.538542" elapsed="0.002861"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.542011" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.541560" elapsed="0.000479"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.542087" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:04.534865" elapsed="0.007345"/>
</kw>
<msg time="2026-04-07T17:20:04.542263" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.523364" elapsed="0.018949"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.553927" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.565418" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.576760" 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-07T17:20:04.576950" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.577137" 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-07T17:20:04.577499" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.577357" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:04.577342" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.577745" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.577911" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.578090" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.577314" elapsed="0.000831"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.577213" elapsed="0.000956"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.578309" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.578383" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:20:04.578499" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:04.519447" elapsed="0.059077"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.579743" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.579509" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.579896" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.579177" elapsed="0.000742"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.580251" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.580007" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.580784" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.580490" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.580332" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.579987" elapsed="0.000880"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.583216" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.581029" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:04.583293" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:04.583444" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.578839" elapsed="0.004629"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.584708" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.584476" elapsed="0.000293">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.584860" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.584147" elapsed="0.000737"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:04.585107" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.584955" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.584936" elapsed="0.000253"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.585329" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.585494" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.585559" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:04.587329" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.583805" elapsed="0.003550"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.588723" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.588476" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.589178" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.588914" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:04.606246" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:04.607207" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:04.607675" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:04.591201" elapsed="0.016533"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.589290" elapsed="0.018539"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.608245" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.607886" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.589271" elapsed="0.019166"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.615372" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.610687" elapsed="0.004890"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.610214" elapsed="0.005404"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.610171" elapsed="0.005471"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.618189" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.615917" elapsed="0.002318"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.615699" elapsed="0.002571"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.615681" elapsed="0.002614"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.618855" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.618451" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.619201" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.618952" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.619734" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.619436" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.619283" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.618933" elapsed="0.000884"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.620352" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.619984" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.620675" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.620449" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.621222" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.620910" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.620757" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.620430" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.621447" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:04.622271" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.621985" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.622447" elapsed="0.002129"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:04.609226" elapsed="0.015412"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.624812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.624708" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.624689" elapsed="0.000190"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:04.630513" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:04.625037" elapsed="0.005506"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:04.630595" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:04.630754" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:04.587663" elapsed="0.043117"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.630842" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:04.631040" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:04.498853" elapsed="0.132239"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.631556" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.631258" elapsed="0.000424"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.631208" elapsed="0.000518"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.631813" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:04.493994" elapsed="0.138078"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.490022" elapsed="0.142126"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.490002" elapsed="0.142204"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.633266" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.633066" elapsed="0.000280"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:04.633576" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.633382" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.633006" elapsed="0.000712"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.634648" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:20:04.634833" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:04.632463" elapsed="0.002429"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.636144" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.635210" elapsed="0.000996"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.637796" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.636497" elapsed="0.001360"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.645229" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.644957" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.645718" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.645473" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:04.655790" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:04.655877" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:04 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":214,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:20:03.929","LastApplied":538,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":538,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.722","active":true,"matchIndex":538,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":539},{"timeSinceLastActivity":"00:00:00.727","active":true,"matchIndex":538,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":539}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"985.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":142,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":54,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582404,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:04.656078" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:04.647860" elapsed="0.008257"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.645878" elapsed="0.010303"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.656439" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.656219" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.645857" elapsed="0.010757"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.661490" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":214,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:20:03.929","LastApplied":538,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":538,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.722","active":true,"matchIndex":538,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":539},{"timeSinceLastActivity":"00:00:00.727","active":true,"matchIndex":538,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":539}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"985.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":142,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":54,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582404,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.658229" elapsed="0.003351"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.657871" elapsed="0.003760"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.657844" elapsed="0.003823"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.665507" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.662115" elapsed="0.003459"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.661749" elapsed="0.003875"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.661724" elapsed="0.003936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.666476" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.665885" elapsed="0.000631"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.666960" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.666623" elapsed="0.000447"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.667770" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.667332" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.667106" elapsed="0.000754"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.666596" elapsed="0.001296"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.668667" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.668138" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.669165" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.668808" elapsed="0.000443"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.670026" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.669510" elapsed="0.000556"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.669286" elapsed="0.000865"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.668782" elapsed="0.001400"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.670397" elapsed="0.000413"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:04.671257" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.670982" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.671430" elapsed="0.002097"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:04.657247" elapsed="0.016342"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.673821" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.673715" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.673694" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:04.676863" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:04.674109" elapsed="0.002782"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:04.677050" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:20:04.677406" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:04.640074" elapsed="0.037382"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.677528" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:04.677855" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:04.638254" elapsed="0.039662"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.680127" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.679303" elapsed="0.000876"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:04.680242" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:04.680598" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:04.678403" elapsed="0.002257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.681336" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 538, 'CommittedTransactionsCount': 142, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.680950" elapsed="0.000448"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.682148" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.681731" elapsed="0.000478"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:04.682430" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:04.682591" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:04.486390" elapsed="0.196225"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:04.682671" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:04.682815" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:20:04.485611" elapsed="0.197228"/>
</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-07T17:20:04.683344" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.682917" elapsed="0.000487"/>
</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="PASS" start="2026-04-07T17:20:04.683638" elapsed="0.000230"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.683430" elapsed="0.000478"/>
</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-07T17:20:04.684094" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.683933" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.682899" elapsed="0.001272"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:04.485443" elapsed="0.198752"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.688227" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.687603" elapsed="0.000675"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:04.688337" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:04.688660" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.686200" elapsed="0.002517"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.734820" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.734439" elapsed="0.000444"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.735610" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.735394" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.735766" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.735061" elapsed="0.000729"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.736350" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.735949" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.736668" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:04.736799" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:04.736533" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.737234" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.736991" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.738210" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.737943" elapsed="0.000310"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.738682" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.738416" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.739029" elapsed="0.000024"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.739230" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.739395" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.738885" elapsed="0.000566"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.738754" elapsed="0.000725"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:04.739520" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:04.739675" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:04.737629" elapsed="0.002070"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.737345" elapsed="0.002385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.739893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.739754" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.737326" elapsed="0.002659"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.740545" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.740125" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.740618" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:04.733801" elapsed="0.006939"/>
</kw>
<msg time="2026-04-07T17:20:04.740792" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.722198" elapsed="0.018644"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.752223" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.763813" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.776414" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.776610" 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-07T17:20:04.776785" 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-07T17:20:04.777162" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.777023" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:04.777007" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.777378" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.777540" 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-07T17:20:04.777701" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.776961" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.776859" elapsed="0.000920"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.777916" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.778005" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:20:04.778122" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:04.718287" elapsed="0.059861"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.779411" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.779152" elapsed="0.000322">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.779565" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.778802" elapsed="0.000786"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.779899" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.779659" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.780444" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.780156" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.779999" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.779640" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.782714" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.780671" elapsed="0.002071"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:04.782792" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:04.782945" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.778462" elapsed="0.004521"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.784230" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.783989" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.784384" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.783645" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:04.784613" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.784479" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.784460" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.784835" elapsed="0.000028"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.785024" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.785093" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:04.786857" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.783327" elapsed="0.003556"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.788316" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.788068" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.788745" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.788507" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:04.808999" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:04.809876" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:04.810374" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:04.791073" elapsed="0.019361"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.788854" elapsed="0.021676"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.810946" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.810588" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.788836" elapsed="0.022337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.819143" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.813475" elapsed="0.006143"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.812956" elapsed="0.006753"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.812913" elapsed="0.006838"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.822143" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.820046" elapsed="0.002142"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.819813" elapsed="0.002409"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.819795" elapsed="0.002451"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.822771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.822400" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.823127" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.822883" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.823657" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.823361" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.823209" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.822864" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.824270" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.823892" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.824589" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.824365" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.825131" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.824822" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.824669" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.824347" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.825356" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:04.826140" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.825853" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.826312" elapsed="0.002141"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:04.811955" elapsed="0.016560"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.828687" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.828583" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.828565" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:04.834303" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:04.828892" elapsed="0.005440"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:04.834384" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:04.834541" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:04.787259" elapsed="0.047307"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.834627" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:04.834800" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:04.697758" elapsed="0.137091"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.835367" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.835065" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.835014" elapsed="0.000524"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.835624" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:04.692928" elapsed="0.142934"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.688926" elapsed="0.147013"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.688906" elapsed="0.147108"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.837074" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.836859" elapsed="0.000297"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:04.837385" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.837191" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.836800" elapsed="0.000726"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.838437" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:20:04.838622" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:04.836272" elapsed="0.002409"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.839911" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.839006" elapsed="0.000986"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.841589" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.840286" elapsed="0.001364"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.849014" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.848748" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.849505" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.849261" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:04.858397" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:04.858455" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:04 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:04 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":538,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":538,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"459.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582404,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:04.858557" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:04.851589" elapsed="0.006994"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.849664" elapsed="0.008962"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.858801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.858653" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.849643" elapsed="0.009243"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.863313" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":538,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":538,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"459.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582404,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.860270" elapsed="0.003127"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.859872" elapsed="0.003575"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.859847" elapsed="0.003636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.867012" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.863865" elapsed="0.003246"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.863562" elapsed="0.003598"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.863537" elapsed="0.003658"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.867903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.867410" elapsed="0.000519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.868254" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.868021" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.868787" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.868489" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.868336" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.868002" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.869397" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.869038" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.869717" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.869493" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.870266" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.869949" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.869797" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.869475" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.870491" elapsed="0.000469"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:04.871424" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.871152" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.871598" elapsed="0.002108"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:04.859333" elapsed="0.014435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.874024" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:04.873893" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.873872" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:04.876907" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:04.874282" elapsed="0.002653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:04.877057" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:20:04.877409" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:04.843794" elapsed="0.033704"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.877579" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:20:04.877913" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:04.842018" elapsed="0.035971"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.880296" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.879342" elapsed="0.001006"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:04.880413" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:04.880772" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:04.878425" elapsed="0.002409"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.881515" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 538, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.881156" elapsed="0.000420"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:04.882318" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.881907" elapsed="0.000471"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:04.882605" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:04.882760" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:04.685288" elapsed="0.197496"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:04.882842" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:04.883003" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:04.684517" elapsed="0.198512"/>
</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="PASS" start="2026-04-07T17:20:04.883349" elapsed="0.000226"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.883137" elapsed="0.000476"/>
</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-07T17:20:04.883778" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.883638" 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-07T17:20:04.884111" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.883856" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.883090" elapsed="0.001098"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:04.684352" elapsed="0.199860"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.888403" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.887713" elapsed="0.000739"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:04.888511" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:04.888834" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:04.886366" elapsed="0.002525"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.935212" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.934818" elapsed="0.000422"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.935950" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.935741" elapsed="0.000290">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.936163" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.935414" elapsed="0.000773"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.936733" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.936347" elapsed="0.000413"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.937068" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:04.937197" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:04.936916" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.937624" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.937374" 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-07T17:20:04.938745" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.938494" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.939221" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:04.938942" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.939577" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.939776" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.939944" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.939447" elapsed="0.000570"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.939293" elapsed="0.000754"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:04.940089" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:04.940246" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:04.938176" elapsed="0.002094"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.937735" elapsed="0.002566"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.940468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.940325" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.937715" elapsed="0.002828"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.941117" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:04.940678" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:04.941191" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:04.934217" elapsed="0.007095"/>
</kw>
<msg time="2026-04-07T17:20:04.941364" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:04.922649" elapsed="0.018766"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.952709" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.964153" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.975772" elapsed="0.000033"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.976098" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.976273" 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-07T17:20:04.976637" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.976498" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:04.976483" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.976849" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.977034" elapsed="0.000023"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.977200" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:04.976454" elapsed="0.000800"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.976347" elapsed="0.000933"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.977419" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.977493" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:04.977609" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:04.918729" elapsed="0.058905"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.978886" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.978638" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.979059" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.978293" elapsed="0.000790"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.979394" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:04.979154" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.979945" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:04.979655" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.979474" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.979135" elapsed="0.000911"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.982345" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:04.980190" elapsed="0.002181"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:04.982421" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:04.982572" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.977952" elapsed="0.004644"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:04.983810" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:04.983549" elapsed="0.000323">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:04.984022" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:04.983221" elapsed="0.000827"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:04.984259" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:04.984125" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.984106" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.984479" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:04.984643" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:04.984708" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:04.986621" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:04.982886" elapsed="0.003760"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.988068" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.987800" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:04.988501" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:04.988260" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.006071" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.006462" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:05.006779" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:04.990518" elapsed="0.016321"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.988611" elapsed="0.018321"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.007371" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.007036" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.988592" elapsed="0.018973"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.015808" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.009855" elapsed="0.006432"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.009376" elapsed="0.006993"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.009333" elapsed="0.007093"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.019002" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.016893" elapsed="0.002156"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.016559" elapsed="0.002524"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.016514" elapsed="0.002594"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.019628" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.019261" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.019983" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.019725" elapsed="0.000319"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.020517" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.020222" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.020067" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.019706" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.021125" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.020750" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.021448" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.021221" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.022000" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.021686" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.021533" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.021202" elapsed="0.000885"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.022234" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.023020" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.022733" elapsed="0.000314"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.023195" elapsed="0.002142"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.008390" elapsed="0.017009"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.025572" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.025469" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.025450" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.031292" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.025791" elapsed="0.005530"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.031373" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.031529" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:04.986942" elapsed="0.044613"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.031616" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:05.031787" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:04.898147" elapsed="0.133715"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.032356" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.032053" elapsed="0.000427"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.032002" elapsed="0.000523"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.032611" elapsed="0.000058"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:04.893130" elapsed="0.139717"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:04.889116" elapsed="0.143807"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:04.889096" elapsed="0.143902"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.034063" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.033840" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:05.034374" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.034180" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.033781" elapsed="0.000735"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.035436" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:20:05.035627" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:05.033255" elapsed="0.002430"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.036919" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.036018" elapsed="0.000977"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.038585" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.037287" elapsed="0.001360"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.045841" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.045591" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.046350" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.046105" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.058862" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.059028" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:05 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Follower","LastApplied":538,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":538,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"323.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582405,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:05.059263" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.048549" elapsed="0.010771"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.046511" elapsed="0.012903"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.059807" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.059472" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.046490" elapsed="0.013560"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.066409" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":537,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":537,"Leader":"member-1-shard-topology-operational","LastIndex":538,"RaftState":"Follower","LastApplied":538,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":538,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"323.7 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":538,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":151354},"timestamp":1775582405,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.062514" elapsed="0.003979"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.061913" elapsed="0.004628"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.061872" elapsed="0.004704"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.070035" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.066952" elapsed="0.003146"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.066655" elapsed="0.003491"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.066631" elapsed="0.003549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.070907" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.070396" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.071388" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.071068" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.072187" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.071718" elapsed="0.000505"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.071503" elapsed="0.000770"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.071042" elapsed="0.001261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.072984" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.072517" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.073310" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.073082" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.073832" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.073544" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.073392" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.073064" elapsed="0.000849"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.074073" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.074842" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.074573" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.075136" elapsed="0.002121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.060934" elapsed="0.016384"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.077550" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.077442" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.077421" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.080612" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.077806" elapsed="0.002835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.080744" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:20:05.081116" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.040818" elapsed="0.040379"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.081273" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:05.081603" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.039066" elapsed="0.042598"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.083803" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.083028" elapsed="0.000828"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:05.083920" elapsed="0.000077"/>
</return>
<msg time="2026-04-07T17:20:05.084308" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:05.082112" elapsed="0.002257"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.085028" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 538, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.084657" elapsed="0.000433"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.085828" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.085416" elapsed="0.000472"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:05.086136" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.086292" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:04.885472" elapsed="0.200845"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:05.086373" elapsed="0.000024"/>
</return>
<msg time="2026-04-07T17:20:05.086515" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:04.884702" elapsed="0.201837"/>
</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="PASS" start="2026-04-07T17:20:05.086826" elapsed="0.000238"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.086617" elapsed="0.000485"/>
</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-07T17:20:05.087267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.087126" 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-07T17:20:05.087644" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.087497" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.086600" elapsed="0.001120"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:04.884532" elapsed="0.203212"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:04.485065" elapsed="0.602708"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.087814" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:05.088147" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:20:05.088196" level="INFO">${follower_list} = [2, 3]</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-07T17:20:04.481066" elapsed="0.607154"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.088671" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:20:05.088747" level="INFO">${leader_count} = 1</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-07T17:20:05.088393" elapsed="0.000377"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.089074" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.088840" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.088822" elapsed="0.000331"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.091169" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:20:05.089288" elapsed="0.001927"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:20:05.091608" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.091420" elapsed="0.000216"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.091685" 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="PASS" start="2026-04-07T17:20:04.478567" elapsed="0.613271"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:20:04.478352" elapsed="0.613532"/>
</iter>
<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-07T17:20:05.096276" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.095805" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.096877" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.096573" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:05.096945" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:20:05.097121" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.095441" elapsed="0.001704"/>
</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-07T17:20:05.097292" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.097929" 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-07T17:20:05.097601" elapsed="0.000353"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.098360" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.098124" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.098765" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.098526" elapsed="0.000264"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.102859" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.102251" elapsed="0.000658"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:05.102984" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:05.103315" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:05.100876" elapsed="0.002498"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.149599" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.149217" elapsed="0.000410"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.150346" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.150134" elapsed="0.000275">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.150499" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.149790" elapsed="0.000733"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.151078" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.150678" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.151391" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:05.151528" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:05.151258" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.152006" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.151745" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.153016" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.152747" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.153477" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.153215" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.153813" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.154028" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.154197" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.153681" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.153549" elapsed="0.000733"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:05.154323" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.154478" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:05.152426" elapsed="0.002076"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.152120" elapsed="0.002414"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.154704" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.154559" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.152101" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.155356" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.154916" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.155429" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.148600" elapsed="0.006951"/>
</kw>
<msg time="2026-04-07T17:20:05.155601" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.137094" elapsed="0.018559"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.167087" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.178471" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.189903" 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-07T17:20:05.190111" 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-07T17:20:05.190279" 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-07T17:20:05.190635" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.190493" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:05.190479" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.190903" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.191084" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.191246" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.190451" elapsed="0.000848"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.190351" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.191463" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.191537" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:05.191651" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:05.133185" elapsed="0.058491"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.193257" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.192887" elapsed="0.000442">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.193421" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.192324" elapsed="0.001121"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.193761" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.193521" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.194308" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.194020" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.193841" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.193501" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.196719" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.194534" elapsed="0.002212"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:05.196796" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.196945" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.192003" elapsed="0.004985"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.198194" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.197934" elapsed="0.000321">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.198345" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.197608" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:05.198573" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.198440" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.198421" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.198792" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.198955" elapsed="0.000039"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.199040" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:05.200938" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.197285" elapsed="0.003679"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.202379" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.202136" elapsed="0.000288"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.202808" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.202568" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.215047" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.215441" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:05.215680" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.204941" elapsed="0.010785"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.202915" elapsed="0.012881"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.216070" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.215832" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.202897" elapsed="0.013293"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.221072" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.217587" elapsed="0.003774"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.217287" elapsed="0.004124"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.217260" elapsed="0.004186"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.224782" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.221827" elapsed="0.003021"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.221522" elapsed="0.003374"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.221499" elapsed="0.003431"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.225703" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.225162" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.226058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.225815" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.226587" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.226293" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.226140" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.225797" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.227192" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.226820" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.227512" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.227286" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.228055" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.227749" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.227593" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.227268" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.228278" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.229078" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.228789" elapsed="0.000315"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.229251" elapsed="0.002114"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.216658" elapsed="0.014768"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.231598" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.231495" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.231477" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.238197" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.231801" elapsed="0.006425"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.238277" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.238433" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.201324" elapsed="0.037135"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.238519" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:05.238689" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.112662" elapsed="0.126076"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.239223" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.238901" elapsed="0.000444"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.238852" elapsed="0.000536"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.239473" elapsed="0.000059"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:05.107712" elapsed="0.131997"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.103583" elapsed="0.136201"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.103564" elapsed="0.136275"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.240921" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.240694" elapsed="0.000325"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:05.241250" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.241056" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.240636" elapsed="0.000755"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.242300" elapsed="0.000057"/>
</kw>
<msg time="2026-04-07T17:20:05.242486" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:05.240113" elapsed="0.002431"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.243772" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.242842" elapsed="0.000990"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.245458" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.244152" elapsed="0.001366"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.252646" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.252390" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.253166" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.252903" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.261750" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.261808" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:05 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":30,"SnapshotIndex":141,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":141,"Leader":"member-1-shard-default-operational","LastIndex":144,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":142,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":144,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.342","active":true,"matchIndex":142,"voting":true,"id":"member-3-shard-default-operational","nextIndex":143},{"timeSinceLastActivity":"00:00:00.340","active":true,"matchIndex":142,"voting":true,"id":"member-2-shard-default-operational","nextIndex":143}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"772.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":142,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":42,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53582},"timestamp":1775582405,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:05.261914" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.255206" elapsed="0.006733"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.253327" elapsed="0.008673"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.262175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.262026" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.253307" elapsed="0.008981"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.307361" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":30,"SnapshotIndex":141,"InMemoryJournalLogSize":3,"ReplicatedToAllIndex":141,"Leader":"member-1-shard-default-operational","LastIndex":144,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":142,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":144,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.342","active":true,"matchIndex":142,"voting":true,"id":"member-3-shard-default-operational","nextIndex":143},{"timeSinceLastActivity":"00:00:00.340","active":true,"matchIndex":142,"voting":true,"id":"member-2-shard-default-operational","nextIndex":143}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"772.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":142,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":42,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53582},"timestamp":1775582405,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.263336" elapsed="0.044117"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.263123" elapsed="0.044383"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.263104" elapsed="0.044438"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.310133" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.307905" elapsed="0.002274"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.307627" elapsed="0.002586"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.307595" elapsed="0.002642"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.310839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.310412" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.311194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.310937" elapsed="0.000315"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.311735" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.311432" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.311276" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.310918" elapsed="0.000899"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.312350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.311987" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.312676" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.312445" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.313252" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.312908" elapsed="0.000370"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.312757" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.312427" elapsed="0.000907"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.313481" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.314311" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.314011" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.314486" elapsed="0.002116"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.262687" elapsed="0.053988"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.316954" elapsed="0.000044"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.316842" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.316822" elapsed="0.000233"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.320032" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.317256" elapsed="0.002805"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.320225" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:05.320595" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.247633" elapsed="0.073014"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.320719" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:05.321075" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.245877" elapsed="0.075260"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.323402" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.322572" elapsed="0.000884"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:05.323519" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:05.323885" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:05.321632" elapsed="0.002319"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.324634" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 142, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.324269" elapsed="0.000428"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.325458" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.325049" elapsed="0.000469"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:05.325743" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.325897" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:05.099962" elapsed="0.225960"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:05.326000" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:05.326148" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:20:05.099215" elapsed="0.226957"/>
</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-07T17:20:05.326462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.326251" elapsed="0.000267"/>
</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="PASS" start="2026-04-07T17:20:05.326742" elapsed="0.000243"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.326542" elapsed="0.000482"/>
</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-07T17:20:05.327189" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.327048" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.326234" elapsed="0.001028"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:05.099052" elapsed="0.228234"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.331544" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.330915" elapsed="0.000684"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:05.331661" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:05.332003" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:05.329318" elapsed="0.002746"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.378425" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.378046" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.379255" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.379004" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.379425" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.378656" elapsed="0.000793"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.380015" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.379616" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.380338" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:05.380498" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:05.380200" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.380913" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.380673" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.381917" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.381667" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.382404" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.382134" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.382749" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.382947" elapsed="0.000041"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.383136" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.382621" elapsed="0.000572"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.382481" elapsed="0.000741"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:05.383266" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.383421" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:05.381331" elapsed="0.002115"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.381048" elapsed="0.002429"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.383801" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.383502" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.381027" elapsed="0.002855"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.384470" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.384039" elapsed="0.000458"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.384544" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.377398" elapsed="0.007267"/>
</kw>
<msg time="2026-04-07T17:20:05.384719" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.365875" elapsed="0.018895"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.396115" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.407721" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.419585" 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-07T17:20:05.419776" 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-07T17:20:05.419946" elapsed="0.000024"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.420326" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.420188" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:05.420173" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.420539" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.420700" 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-07T17:20:05.420859" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.420138" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.420037" elapsed="0.000900"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.421093" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.421168" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:05.421300" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:05.361946" elapsed="0.059380"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.422567" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.422326" elapsed="0.000308">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.422725" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.421986" elapsed="0.000763"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.423073" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.422818" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.423602" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.423309" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.423155" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.422800" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.425865" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.423828" elapsed="0.002063"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:05.425940" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:20:05.426107" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.421655" elapsed="0.004476"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.427384" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.427150" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.427537" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.426784" elapsed="0.000777"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:05.427768" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.427632" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.427613" elapsed="0.000237"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.428008" elapsed="0.000024"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.428176" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.428242" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:05.430164" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.426470" elapsed="0.003721"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.431544" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.431297" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.431990" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.431735" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.445629" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.446609" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:05.447083" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.434026" elapsed="0.013118"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.432104" elapsed="0.015134"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.447636" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.447296" elapsed="0.000483"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.432085" elapsed="0.015741"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.455221" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.450135" elapsed="0.005290"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.449598" elapsed="0.005863"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.449555" elapsed="0.005931"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.457862" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.455764" elapsed="0.002143"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.455547" elapsed="0.002394"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.455526" elapsed="0.002439"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.458506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.458134" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.458830" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.458602" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.459378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.459082" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.458911" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.458583" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.459969" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.459611" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.460305" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.460078" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.460831" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.460540" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.460387" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.460060" elapsed="0.000853"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.461071" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.461866" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.461569" elapsed="0.000323"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.462058" elapsed="0.002107"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.448623" elapsed="0.015605"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.464400" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.464297" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.464278" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.470143" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.464606" elapsed="0.005566"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.470225" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.470382" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.430489" elapsed="0.039918"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.470468" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:05.470640" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.341237" elapsed="0.129453"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.471177" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.470854" elapsed="0.000447"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.470805" elapsed="0.000540"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.471432" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:05.336346" elapsed="0.135323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.332272" elapsed="0.139473"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.332253" elapsed="0.139548"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.472864" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.472667" elapsed="0.000277"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:05.473193" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.472997" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.472609" elapsed="0.000726"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.474266" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:20:05.474452" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:05.472081" elapsed="0.002430"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.475751" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.474816" elapsed="0.000995"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.477431" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.476134" elapsed="0.001360"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.484644" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.484394" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.485189" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.484884" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.492828" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.492885" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:05 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":145,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":145,"Leader":"member-1-shard-default-operational","LastIndex":146,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":146,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":146,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"287.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":146,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53664},"timestamp":1775582405,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:05.493006" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.487255" elapsed="0.005778"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.485350" elapsed="0.007726"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.493255" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.493103" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.485329" elapsed="0.008011"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.497714" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":145,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":145,"Leader":"member-1-shard-default-operational","LastIndex":146,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":146,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":146,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"287.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":146,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53664},"timestamp":1775582405,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.494456" elapsed="0.003341"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.494206" elapsed="0.003642"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.494187" elapsed="0.003695"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.501292" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.498309" elapsed="0.003047"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.497997" elapsed="0.003407"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.497937" elapsed="0.003502"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.502238" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.501658" elapsed="0.000618"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.502729" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.502377" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.503293" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.502990" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.502821" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.502351" elapsed="0.001025"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.503891" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.503530" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.504235" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.504004" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.504765" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.504467" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.504316" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.503984" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.505007" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.505779" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.505509" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.505952" elapsed="0.002157"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.493740" elapsed="0.014432"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.508404" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.508297" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.508276" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.511282" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.508658" elapsed="0.002653"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.511414" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:20:05.511773" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.479633" elapsed="0.032190"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.511937" elapsed="0.000082"/>
</return>
<msg time="2026-04-07T17:20:05.512291" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.477844" elapsed="0.034507"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.514555" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.513732" elapsed="0.000880"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:05.514675" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:05.515049" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:05.512836" elapsed="0.002275"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.515762" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 146, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.515403" elapsed="0.000421"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.516562" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.516171" elapsed="0.000451"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:05.516846" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.517018" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:05.328384" elapsed="0.188660"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:05.517388" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.517544" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:05.327623" elapsed="0.189945"/>
</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="PASS" start="2026-04-07T17:20:05.517860" elapsed="0.000273"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.517651" elapsed="0.000520"/>
</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-07T17:20:05.518336" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.518196" 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-07T17:20:05.518547" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.518413" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.517633" elapsed="0.000986"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:05.327459" elapsed="0.191183"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.522708" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.522097" elapsed="0.000662"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:05.522818" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:05.523303" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:05.520714" elapsed="0.002648"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.569765" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.569388" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.570528" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.570316" elapsed="0.000275">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.570724" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.569951" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.571309" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.570908" elapsed="0.000428"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.571626" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:05.571761" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:05.571491" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.572195" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.571937" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.573181" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.572910" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.573642" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.573379" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.573996" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.574197" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.574395" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.573847" elapsed="0.000607"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.573715" elapsed="0.000769"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:05.574527" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.574688" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:05.572594" elapsed="0.002119"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.572308" elapsed="0.002436"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.574910" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.574768" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.572287" elapsed="0.002716"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.575562" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.575142" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.575636" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.568767" elapsed="0.006990"/>
</kw>
<msg time="2026-04-07T17:20:05.575809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.557251" elapsed="0.018609"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.587377" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.598705" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.610200" 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-07T17:20:05.610390" 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-07T17:20:05.610579" 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-07T17:20:05.610933" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.610794" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:05.610779" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.611171" 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-07T17:20:05.611333" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.611495" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.610751" elapsed="0.000799"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.610654" elapsed="0.000923"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.611717" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.611791" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:05.611907" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:05.553316" elapsed="0.058616"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.613164" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.612912" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.613315" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.612579" elapsed="0.000760"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.613648" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.613409" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.614190" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.613882" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.613727" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.613390" elapsed="0.000883"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.616737" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.614417" elapsed="0.002347"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:05.616822" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.616987" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.612261" elapsed="0.004752"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.618223" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.617959" elapsed="0.000326">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.618671" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.617631" elapsed="0.001068"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:05.618910" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.618773" elapsed="0.000218"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.618754" elapsed="0.000263"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.619161" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.619325" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.619390" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:05.621277" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.617311" elapsed="0.003993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.622690" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.622412" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.623142" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.622882" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.636940" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.637511" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:05.637789" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.625153" elapsed="0.012673"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.623251" elapsed="0.014634"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.638151" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.637921" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.623232" elapsed="0.015039"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.645397" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.639739" elapsed="0.006112"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.639374" elapsed="0.006557"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.639348" elapsed="0.006670"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.649402" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.646677" elapsed="0.002769"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.646148" elapsed="0.003332"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.646110" elapsed="0.003394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.650050" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.649663" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.650377" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.650146" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.651007" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.650626" elapsed="0.000409"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.650458" elapsed="0.000613"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.650128" elapsed="0.000965"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.651631" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.651247" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.651963" elapsed="0.000041"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.651733" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.652515" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.652219" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.652064" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.651714" elapsed="0.000897"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.652766" elapsed="0.000378"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.653590" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.653305" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.653767" elapsed="0.002181"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.638772" elapsed="0.017257"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.656207" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.656100" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.656081" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.662084" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.656413" elapsed="0.005702"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.662167" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.662325" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.621597" elapsed="0.040754"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.662412" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.662600" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.532676" elapsed="0.129979"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.663209" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.662860" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.662809" elapsed="0.000573"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.663478" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:05.527728" elapsed="0.135994"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.523573" elapsed="0.140226"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.523553" elapsed="0.140303"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.664948" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.664746" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:05.665295" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.665086" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.664686" elapsed="0.000768"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.666494" elapsed="0.000058"/>
</kw>
<msg time="2026-04-07T17:20:05.666707" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:05.664137" elapsed="0.002640"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.668159" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.667113" elapsed="0.001106"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.669836" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.668520" elapsed="0.001379"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.677280" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.677030" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.677781" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.677537" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.685846" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.685905" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:05 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":145,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":145,"Leader":"member-1-shard-default-operational","LastIndex":146,"RaftState":"Follower","LastApplied":146,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":146,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"298.9 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":146,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53664},"timestamp":1775582405,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:05.686035" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.679936" elapsed="0.006126"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.677942" elapsed="0.008162"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.686301" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.686130" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.677922" elapsed="0.008470"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.690930" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":145,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":145,"Leader":"member-1-shard-default-operational","LastIndex":146,"RaftState":"Follower","LastApplied":146,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":146,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"298.9 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":146,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":53664},"timestamp":1775582405,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.687584" elapsed="0.003453"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.687311" elapsed="0.003777"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.687292" elapsed="0.003833"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.694605" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.691526" elapsed="0.003143"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.691216" elapsed="0.003501"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.691188" elapsed="0.003564"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.695560" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.695031" elapsed="0.000575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.695990" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.695727" elapsed="0.000323"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.696524" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.696227" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.696074" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.695695" elapsed="0.000911"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.697133" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.696756" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.697459" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.697228" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.698009" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.697700" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.697541" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.697210" elapsed="0.000882"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.698235" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.699034" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.698732" elapsed="0.000328"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.699208" elapsed="0.002115"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.686829" elapsed="0.014556"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.701613" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.701505" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.701485" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.704501" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.701867" elapsed="0.002663"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.704630" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:20:05.704993" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.672152" elapsed="0.032892"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.705149" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:20:05.705476" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.670268" elapsed="0.035267"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.707673" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.706867" elapsed="0.000858"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:05.707788" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:05.708160" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558240...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:05.705963" elapsed="0.002259"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.708864" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 146, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.708509" elapsed="0.000415"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.709652" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.709269" elapsed="0.000442"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:05.709929" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.710101" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:05.519819" elapsed="0.190307"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:05.710181" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:05.710325" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:05.518957" elapsed="0.191392"/>
</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="PASS" start="2026-04-07T17:20:05.710635" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.710426" elapsed="0.000494"/>
</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-07T17:20:05.711103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.710946" 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-07T17:20:05.711319" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.711183" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.710409" elapsed="0.000983"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:05.518795" elapsed="0.192621"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.098835" elapsed="0.612612"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.711488" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:05.711688" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:20:05.711734" level="INFO">${follower_list} = [2, 3]</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-07T17:20:05.094721" elapsed="0.617036"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.712305" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:20:05.712380" level="INFO">${leader_count} = 1</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-07T17:20:05.711926" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.712681" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.712472" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.712454" elapsed="0.000309"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.714796" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:20:05.712892" elapsed="0.001950"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:20:05.715252" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.715063" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.715324" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:20:05.092289" elapsed="0.623187"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:20:05.092048" elapsed="0.623475"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:20:04.478222" elapsed="1.237333"/>
</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="PASS" start="2026-04-07T17:20:04.477819" elapsed="1.237789"/>
</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-07T17:20:05.720756" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.720375" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.721254" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.720936" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:05.721325" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:05.721476" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.719947" elapsed="0.001554"/>
</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-07T17:20:05.721647" elapsed="0.000153"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.722297" 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-07T17:20:05.721954" elapsed="0.000369"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.722714" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.722474" elapsed="0.000265"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.723149" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:05.722881" elapsed="0.000294"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.727474" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.726802" elapsed="0.000723"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:05.727585" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:05.727910" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:05.725437" elapsed="0.002548"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.776983" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.776589" elapsed="0.000423"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.777720" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.777500" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.777919" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.777171" elapsed="0.000772"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.778529" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.778124" elapsed="0.000432"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.778852" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:05.779044" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:05.778713" elapsed="0.000357"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.779508" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.779246" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.780514" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.780249" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.780994" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.780714" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.781346" elapsed="0.000025"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.781552" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.781719" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.781203" elapsed="0.000575"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.781070" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:05.781848" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.782026" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:05.779915" elapsed="0.002137"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.779629" elapsed="0.002456"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.782253" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.782110" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.779607" elapsed="0.002733"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.782913" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.782480" elapsed="0.000461"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.783007" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.775981" elapsed="0.007152"/>
</kw>
<msg time="2026-04-07T17:20:05.783216" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.764436" elapsed="0.018842"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.795309" elapsed="0.000034"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.806756" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.818503" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.818733" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.818909" elapsed="0.000028"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.819304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.819161" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:05.819145" elapsed="0.000261"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.819562" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.819730" 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-07T17:20:05.819892" elapsed="0.000023"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.819116" elapsed="0.000841"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.819012" elapsed="0.000989"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.820148" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.820226" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:05.820343" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:05.760513" elapsed="0.059855"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.821618" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.821371" elapsed="0.000320">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.821790" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.821033" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.822235" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.821910" elapsed="0.000385"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.822783" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.822478" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.822319" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.821884" elapsed="0.000983"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.825161" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.823046" elapsed="0.002143"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:05.825240" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.825391" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.820687" elapsed="0.004729"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.826626" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.826375" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.826780" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.826043" elapsed="0.000761"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:05.827031" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.826875" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.826856" elapsed="0.000258"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.827256" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.827651" elapsed="0.000033"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.827741" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:05.829937" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:05.825709" elapsed="0.004255"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.831379" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.831123" elapsed="0.000334"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.831854" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.831606" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.843659" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.844285" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:05.844579" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.833885" elapsed="0.010737"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.831965" elapsed="0.012716"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.844926" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.844718" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.831946" elapsed="0.013124"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.849997" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.846463" elapsed="0.003825"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.846162" elapsed="0.004176"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.846135" elapsed="0.004238"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.853508" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.850757" elapsed="0.002796"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.850452" elapsed="0.003135"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.850428" elapsed="0.003186"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.854214" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.853807" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.854542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.854312" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.855095" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.854780" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.854623" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.854293" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.855702" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.855330" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.856038" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.855799" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.856565" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.856273" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.856121" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.855780" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.856788" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.857583" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.857308" elapsed="0.000302"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.857773" elapsed="0.002199"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.845546" elapsed="0.014502"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.860224" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.860118" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.860099" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.865852" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.860432" elapsed="0.005449"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.865934" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:05.866109" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.830298" elapsed="0.035837"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.866197" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:05.866375" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.739856" elapsed="0.126569"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.866888" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.866588" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.866540" elapsed="0.000542"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.867169" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:05.734485" elapsed="0.132923"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.728202" elapsed="0.139283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.728180" elapsed="0.139386"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:05.868630" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:20:05.868432" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.868876" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.868775" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.868373" elapsed="0.000633"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.869903" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:20:05.870105" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:05.867826" elapsed="0.002338"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.871394" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.870465" elapsed="0.000989"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.873284" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.871779" elapsed="0.001566"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.880518" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.880265" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.881029" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.880767" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:05.889794" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:05.889851" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:05 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:05 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":19,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":97,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":97,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.456","active":true,"matchIndex":97,"voting":true,"id":"member-2-shard-topology-config","nextIndex":98},{"timeSinceLastActivity":"00:00:00.457","active":true,"matchIndex":97,"voting":true,"id":"member-3-shard-topology-config","nextIndex":98}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"516.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":30,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582405,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:05.889992" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:05.883076" elapsed="0.006944"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.881190" elapsed="0.008873"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.890239" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.890089" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.881169" elapsed="0.009154"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.894095" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":19,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":97,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":97,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.456","active":true,"matchIndex":97,"voting":true,"id":"member-2-shard-topology-config","nextIndex":98},{"timeSinceLastActivity":"00:00:00.457","active":true,"matchIndex":97,"voting":true,"id":"member-3-shard-topology-config","nextIndex":98}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"516.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":30,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582405,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.891427" elapsed="0.002753"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.891211" elapsed="0.003018"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.891192" elapsed="0.003071"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.897631" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.894641" elapsed="0.003053"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.894342" elapsed="0.003400"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.894318" elapsed="0.003457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.898523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.898010" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.898994" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.898658" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.899793" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.899335" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.899110" elapsed="0.000768"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.898632" elapsed="0.001276"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.900664" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.900141" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.901046" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.900805" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.901580" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.901287" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.901127" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.900783" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.901803" elapsed="0.000372"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:05.902604" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.902335" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.902782" elapsed="0.002258"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:05.890767" elapsed="0.014336"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.905336" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:05.905227" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.905206" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:05.908313" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:05.905589" elapsed="0.002753"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:05.908443" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:20:05.908828" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:05.875485" elapsed="0.033393"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.908950" elapsed="0.000090"/>
</return>
<msg time="2026-04-07T17:20:05.909308" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.873697" elapsed="0.035671"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.911491" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582405, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.910687" elapsed="0.000856"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:05.911606" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:05.911995" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582405, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:05.909797" elapsed="0.002261"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.912710" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 97, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.912345" elapsed="0.000426"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:05.913516" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.913115" elapsed="0.000460"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:05.913794" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:05.913949" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:05.724538" elapsed="0.189471"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:05.914068" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:05.914213" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:20:05.723582" elapsed="0.190655"/>
</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-07T17:20:05.914526" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.914315" elapsed="0.000267"/>
</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="PASS" start="2026-04-07T17:20:05.914811" elapsed="0.000239"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.914611" elapsed="0.000477"/>
</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-07T17:20:05.915259" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.915113" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.914297" elapsed="0.001036"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:05.723419" elapsed="0.191937"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.919368" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.918744" elapsed="0.000674"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:05.919477" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:05.919819" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:05.917339" elapsed="0.002538"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.966689" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:05.966308" elapsed="0.000409"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.967484" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:05.967267" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:05.967640" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:05.966875" elapsed="0.000789"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.968237" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:05.967822" elapsed="0.000442"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:05.968554" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:05.968693" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:05.968419" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.969132" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.968869" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.970124" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:05.969853" elapsed="0.000315"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.970585" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:05.970321" elapsed="0.000289"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.970917" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.971134" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.971302" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:05.970790" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:05.970657" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:05.971429" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:05.971584" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:05.969538" elapsed="0.002071"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.969243" elapsed="0.002398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.971807" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:05.971665" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.969224" elapsed="0.002657"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:05.972483" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:05.972057" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:05.972558" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:05.965687" elapsed="0.006992"/>
</kw>
<msg time="2026-04-07T17:20:05.972731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:05.954162" elapsed="0.018621"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.984319" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:05.995619" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.007016" 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-07T17:20:06.007210" 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-07T17:20:06.007377" 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-07T17:20:06.007732" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.007593" elapsed="0.000194"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:06.007578" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.007944" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.008126" elapsed="0.000038"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.008308" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.007550" elapsed="0.000811"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.007450" elapsed="0.000936"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.008525" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.008599" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:06.008714" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:05.950233" elapsed="0.058506"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.009981" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.009732" elapsed="0.000315">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.010136" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.009394" elapsed="0.000767"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.010471" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.010231" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.011015" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.010709" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.010553" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.010212" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.013291" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.011242" elapsed="0.002075"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:06.013367" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:06.013519" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.009069" elapsed="0.004475"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.014784" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.014551" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.014938" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.014222" elapsed="0.000740"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:06.015190" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.015053" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.015033" elapsed="0.000239"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.015414" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.015579" elapsed="0.000022"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.015646" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:06.017548" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.013836" elapsed="0.003739"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.018930" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.018686" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.019380" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.019139" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.034535" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.035479" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:06.036312" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.021396" elapsed="0.014981"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.019488" elapsed="0.016984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.036860" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.036528" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.019470" elapsed="0.017622"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.043403" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.039326" elapsed="0.004376"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.038813" elapsed="0.004939"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.038770" elapsed="0.005017"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.047266" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.044194" elapsed="0.003136"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.043867" elapsed="0.003511"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.043843" elapsed="0.003569"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.048168" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.047626" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.048706" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.048302" elapsed="0.000489"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.049288" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.048989" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.048819" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.048276" elapsed="0.001095"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.049882" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.049524" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.050222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.049995" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.050756" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.050457" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.050304" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.049959" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.050999" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.051929" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.051657" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.052130" elapsed="0.002140"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.037845" elapsed="0.016488"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.054507" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.054402" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.054383" elapsed="0.000192"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.060292" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.054715" elapsed="0.005607"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.060385" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:06.060545" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.017871" elapsed="0.042701"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.060639" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.060814" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:05.929177" elapsed="0.131687"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.061355" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.061054" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.061002" elapsed="0.000528"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.061618" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:05.924316" elapsed="0.137548"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:05.920100" elapsed="0.141840"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:05.920079" elapsed="0.141939"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:06.063099" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.062882" elapsed="0.000326"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.063350" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.063246" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.062821" elapsed="0.000641"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.064415" elapsed="0.000059"/>
</kw>
<msg time="2026-04-07T17:20:06.064608" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:06.062278" elapsed="0.002391"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.065895" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.064972" elapsed="0.000984"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.067590" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.066272" elapsed="0.001378"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.074775" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.074528" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.075279" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.075034" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.083715" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.083795" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:06 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":97,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":97,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"261.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582406,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:06.083937" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.077406" elapsed="0.006612"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.075438" elapsed="0.008641"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.084324" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.084115" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.075417" elapsed="0.009024"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.089246" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":97,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":97,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"261.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582406,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.085919" elapsed="0.003456"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.085620" elapsed="0.003804"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.085594" elapsed="0.003866"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.092840" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.089844" elapsed="0.003061"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.089539" elapsed="0.003414"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.089515" elapsed="0.003492"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.093747" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.093226" elapsed="0.000558"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.094231" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.093882" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.094994" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.094559" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.094346" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.093856" elapsed="0.001256"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.095823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.095324" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.096297" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.095956" elapsed="0.000422"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.097085" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.096653" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.096411" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.095931" elapsed="0.001270"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.097400" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.098513" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.098114" elapsed="0.000424"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.098685" elapsed="0.002135"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.085037" elapsed="0.015847"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.101137" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.101029" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.101007" elapsed="0.000199"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.103970" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.101393" elapsed="0.002619"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.104113" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:20:06.104457" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.069821" elapsed="0.034686"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.104604" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:06.104936" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.068072" elapsed="0.036939"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.107114" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.106329" elapsed="0.000836"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:06.107262" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:06.107615" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:06.105441" elapsed="0.002234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.108340" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 97, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.107962" elapsed="0.000439"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.109184" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.108747" elapsed="0.000500"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:06.109467" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:20:06.109629" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:05.916456" elapsed="0.193197"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:06.109709" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.109857" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:05.915673" elapsed="0.194208"/>
</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="PASS" start="2026-04-07T17:20:06.110196" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.109960" elapsed="0.000499"/>
</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-07T17:20:06.110655" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.110483" elapsed="0.000228"/>
</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-07T17:20:06.110872" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.110735" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.109943" elapsed="0.001001"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:05.915510" elapsed="0.195470"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.115071" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.114449" elapsed="0.000673"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:06.115181" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:06.115503" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:06.112959" elapsed="0.002602"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.162458" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.162078" elapsed="0.000407"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.163199" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.162965" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.163353" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.162643" elapsed="0.000734"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.163920" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.163536" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.164250" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:06.164382" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:06.164117" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.164852" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.164594" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.165835" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.165584" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.166317" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.166052" elapsed="0.000291"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.166652" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.166850" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.167034" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.166525" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.166392" elapsed="0.000730"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:06.167164" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.167319" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:06.165266" elapsed="0.002078"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.164965" elapsed="0.002410"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.167539" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.167399" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.164945" elapsed="0.002670"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.168188" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.167751" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.168264" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.161461" elapsed="0.006928"/>
</kw>
<msg time="2026-04-07T17:20:06.168441" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.149756" elapsed="0.018735"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.179988" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.191314" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.202568" 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-07T17:20:06.202757" 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-07T17:20:06.202927" 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-07T17:20:06.203341" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.203199" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:06.203183" elapsed="0.000237"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.203555" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.203718" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.203880" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.203155" elapsed="0.000778"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.203054" elapsed="0.000905"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.204123" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.204200" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:06.204315" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:06.145839" elapsed="0.058501"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.205576" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.205338" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.205733" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.205001" 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-07T17:20:06.206092" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.205832" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.206615" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.206328" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.206174" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.205808" elapsed="0.000888"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.208857" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.206842" elapsed="0.002041"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:06.208932" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.209124" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.204654" elapsed="0.004495"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.210327" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.210096" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.210479" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.209754" elapsed="0.000748"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:06.210706" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.210573" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.210554" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.210925" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.211110" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.211175" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:06.214133" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.209440" elapsed="0.004720"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.215517" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.215269" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.215948" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.215710" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.230536" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.231450" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:06.231906" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.218016" elapsed="0.013949"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.216079" elapsed="0.016012"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.232481" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.232149" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.216060" elapsed="0.016612"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.239579" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.234932" elapsed="0.004936"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.234452" elapsed="0.005466"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.234409" elapsed="0.005544"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.243346" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.240362" elapsed="0.003047"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.240056" elapsed="0.003402"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.240030" elapsed="0.003463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.244261" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.243713" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.244715" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.244396" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.245526" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.245068" elapsed="0.000494"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.244828" elapsed="0.000793"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.244370" elapsed="0.001289"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.246251" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.245868" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.246574" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.246347" elapsed="0.000464"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.247314" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.247020" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.246840" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.246329" elapsed="0.001067"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.247540" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.248331" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.248057" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.248506" elapsed="0.002153"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.233479" elapsed="0.017243"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.250894" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.250791" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.250773" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.256711" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.251120" elapsed="0.005620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.256793" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:06.256950" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.214456" elapsed="0.042537"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.257057" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:06.257242" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.124915" elapsed="0.132377"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.257755" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.257457" elapsed="0.000421"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.257408" elapsed="0.000514"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.258034" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:06.119957" elapsed="0.138317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.115766" elapsed="0.142583"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.115747" elapsed="0.142659"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:06.259461" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.259264" elapsed="0.000304"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.259708" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.259606" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.259206" elapsed="0.000614"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.260732" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:20:06.260917" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:06.258663" elapsed="0.002328"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.262491" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.261531" elapsed="0.001020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.264174" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.262842" elapsed="0.001393"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.271559" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.271310" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.272069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.271807" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.282483" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.282564" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:06 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Follower","LastApplied":97,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":97,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"193.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582406,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:06.282724" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.274129" elapsed="0.008630"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.272228" elapsed="0.010596"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.283099" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.282860" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.272207" elapsed="0.011013"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.287783" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":96,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":96,"Leader":"member-1-shard-topology-config","LastIndex":97,"RaftState":"Follower","LastApplied":97,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":97,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"193.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":97,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":3762},"timestamp":1775582406,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.284702" elapsed="0.003225"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.284404" elapsed="0.003595"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.284378" elapsed="0.003658"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.291384" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.288423" elapsed="0.003024"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.288116" elapsed="0.003379"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.288093" elapsed="0.003436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.292291" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.291745" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.292745" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.292426" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.293548" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.293099" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.292859" elapsed="0.000788"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.292401" elapsed="0.001283"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.294260" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.293881" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.294582" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.294355" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.295122" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.294812" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.294662" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.294337" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.295348" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.296133" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.295846" elapsed="0.000312"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.296307" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.283773" elapsed="0.014733"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.298734" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.298627" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.298606" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.301644" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.299012" elapsed="0.002661"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.301775" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:20:06.302141" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.266526" elapsed="0.035665"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.302263" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:06.302589" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.264580" elapsed="0.038069"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.304768" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.303964" elapsed="0.000856"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:06.304917" elapsed="0.000080"/>
</return>
<msg time="2026-04-07T17:20:06.305289" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:06.303092" elapsed="0.002258"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.306030" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 97, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.305654" elapsed="0.000470"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.306845" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.306457" elapsed="0.000446"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:06.307141" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:06.307297" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:06.112061" elapsed="0.195261"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:06.307378" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:06.307521" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:06.111301" elapsed="0.196244"/>
</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="PASS" start="2026-04-07T17:20:06.307831" elapsed="0.000423"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.307621" elapsed="0.000673"/>
</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-07T17:20:06.308464" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.308320" 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-07T17:20:06.308681" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.308544" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.307604" elapsed="0.001152"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:06.111139" elapsed="0.197641"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.723222" elapsed="0.585587"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.308849" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:06.309161" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:20:06.309208" level="INFO">${follower_list} = [2, 3]</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-07T17:20:05.719225" elapsed="0.590007"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.309696" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:20:06.309772" level="INFO">${leader_count} = 1</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-07T17:20:06.309403" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.310093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.309867" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.309848" elapsed="0.000323"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.312059" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:20:06.310303" elapsed="0.001802"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:20:06.312447" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.312262" elapsed="0.000210"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.312518" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:20:05.716651" elapsed="0.596023"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:20:05.716431" elapsed="0.596289"/>
</iter>
<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-07T17:20:06.317089" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.316645" elapsed="0.000472"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.317650" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:06.317322" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:06.317721" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.317873" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.316282" 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-07T17:20:06.318063" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.318703" 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-07T17:20:06.318375" elapsed="0.000354"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.319139" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:06.318881" elapsed="0.000284"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.319542" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:06.319309" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.324337" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.322991" elapsed="0.001409"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:06.324477" elapsed="0.000074"/>
</return>
<msg time="2026-04-07T17:20:06.324833" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:06.321642" elapsed="0.003254"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.372011" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.371613" elapsed="0.000428"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.372775" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.372525" elapsed="0.000314">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.372931" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.372200" elapsed="0.000754"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.373510" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.373132" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.373854" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:06.374018" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:06.373719" elapsed="0.000326"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.374437" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.374197" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.375425" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.375173" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.375888" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.375621" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.376239" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.376438" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.376604" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.376111" elapsed="0.000612"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.375961" elapsed="0.000793"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:06.376797" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:06.376957" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:06.374830" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.374548" elapsed="0.002484"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.377202" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.377057" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.374529" elapsed="0.002751"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.377854" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.377417" elapsed="0.000465"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.377930" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.371008" elapsed="0.007062"/>
</kw>
<msg time="2026-04-07T17:20:06.378123" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.359309" elapsed="0.018866"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.389780" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.401078" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.412360" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.412550" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.412720" 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-07T17:20:06.413095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.412936" elapsed="0.000216"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:06.412922" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.413312" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.413476" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.413637" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.412894" elapsed="0.000797"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.412795" elapsed="0.000921"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.413882" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.414011" elapsed="0.000018"/>
</return>
<msg time="2026-04-07T17:20:06.414131" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:06.355345" elapsed="0.058811"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.415374" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.415139" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.415526" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.414787" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.415862" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.415621" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.416408" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.416118" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.415943" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.415603" elapsed="0.000888"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.418657" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.416636" elapsed="0.002047"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:06.418734" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:06.418885" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.414470" elapsed="0.004440"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.420114" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.419865" elapsed="0.000311">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.420268" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.419535" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:06.420497" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.420362" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.420343" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.420719" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.420884" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.420949" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:06.422862" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.419219" elapsed="0.003670"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.424263" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.424017" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.424693" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.424454" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.440372" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.441163" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:06.441648" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.426704" elapsed="0.015003"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.424802" elapsed="0.017000"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.442248" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.441861" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.424784" elapsed="0.017662"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.450401" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.444694" elapsed="0.006150"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.444214" elapsed="0.006665"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.444171" elapsed="0.006733"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.453369" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.451198" elapsed="0.002217"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.450961" elapsed="0.002488"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.450943" elapsed="0.002531"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.454033" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.453629" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.454361" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.454133" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.454892" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.454595" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.454443" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.454114" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.455503" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.455144" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.455823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.455598" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.456364" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.456072" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.455903" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.455580" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.456586" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.457378" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.457102" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.457717" elapsed="0.002146"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.443248" elapsed="0.016679"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.460135" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.460028" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.460008" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.465784" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.460342" elapsed="0.005471"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.465865" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:06.466064" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.423203" elapsed="0.042888"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.466155" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.466329" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.334361" elapsed="0.132017"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.466837" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.466542" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.466493" elapsed="0.000550"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.467131" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:06.329455" elapsed="0.137918"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.325135" elapsed="0.142314"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.325113" elapsed="0.142393"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:06.468699" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.468499" elapsed="0.000311"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.468950" elapsed="0.000062"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.468848" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.468439" elapsed="0.000651"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.470052" elapsed="0.000058"/>
</kw>
<msg time="2026-04-07T17:20:06.470243" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:06.467761" elapsed="0.002541"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.471543" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.470605" elapsed="0.000999"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.473430" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.471900" elapsed="0.001591"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.480586" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.480338" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.481093" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.480832" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.493651" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.493732" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:06 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.020","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.020","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"451.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:06.493891" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.483234" elapsed="0.010693"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.481255" elapsed="0.012763"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.494283" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.494056" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.481235" elapsed="0.013169"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.498988" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.020","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.020","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"451.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.495923" elapsed="0.003155"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.495625" elapsed="0.003501"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.495599" elapsed="0.003561"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.503185" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.499535" elapsed="0.003714"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.499237" elapsed="0.004060"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.499214" elapsed="0.004117"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.504080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.503545" elapsed="0.000573"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.504535" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.504217" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.505304" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.504866" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.504653" elapsed="0.000737"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.504192" elapsed="0.001228"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.506148" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.505630" elapsed="0.000587"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.506633" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.506316" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.507285" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.506994" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.506759" elapsed="0.000586"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.506291" elapsed="0.001075"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.507509" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.508318" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.508048" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.508492" elapsed="0.002252"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.495035" elapsed="0.015774"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.511068" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.510935" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.510915" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.514009" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.511324" elapsed="0.002715"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.514140" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:20:06.514551" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.475678" elapsed="0.038923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.514674" elapsed="0.000059"/>
</return>
<msg time="2026-04-07T17:20:06.515150" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.473842" elapsed="0.041372"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.517752" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.516890" elapsed="0.000914"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:06.517867" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:06.518265" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:06.515707" elapsed="0.002621"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.519032" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.518638" elapsed="0.000472"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.519864" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.519450" elapsed="0.000473"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:06.520165" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:06.520322" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:06.320730" elapsed="0.199616"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:06.520403" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:06.520547" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:20:06.319988" elapsed="0.200583"/>
</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-07T17:20:06.520860" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.520649" elapsed="0.000269"/>
</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="PASS" start="2026-04-07T17:20:06.521163" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.520941" elapsed="0.000485"/>
</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-07T17:20:06.521590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.521451" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.520633" elapsed="0.001031"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:06.319812" elapsed="0.201876"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.525737" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.525132" elapsed="0.000655"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:06.525845" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:06.526266" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:06.523783" elapsed="0.002543"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.572919" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.572539" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.573860" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.573632" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.574044" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.573123" elapsed="0.000946"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.574624" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.574229" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.574941" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:06.575092" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:06.574806" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.575507" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.575268" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.576483" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.576233" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.576945" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.576682" elapsed="0.000304"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.577299" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.577497" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.577665" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.577171" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.577039" elapsed="0.000711"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:06.577791" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.577945" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:06.575899" elapsed="0.002086"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.575617" elapsed="0.002403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.578187" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.578045" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.575598" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.578848" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.578399" elapsed="0.000477"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.578923" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.571926" elapsed="0.007136"/>
</kw>
<msg time="2026-04-07T17:20:06.579116" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.560182" elapsed="0.018985"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.590811" elapsed="0.000030"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.602115" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.613410" 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-07T17:20:06.613596" 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-07T17:20:06.613764" 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-07T17:20:06.614132" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.613992" elapsed="0.000196"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:06.613963" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.614345" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.614507" 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-07T17:20:06.614687" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.613935" elapsed="0.000807"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.613838" elapsed="0.000929"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.614904" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.614992" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:20:06.615108" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:06.556202" elapsed="0.058932"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.616340" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.616107" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.616491" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.615760" 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-07T17:20:06.616824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.616586" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.617364" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.617078" elapsed="0.000312"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.616904" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.616567" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.619633" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.617589" elapsed="0.002070"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:06.619709" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.619858" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.615445" elapsed="0.004437"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.621130" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.620879" elapsed="0.000313">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.621284" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.620549" elapsed="0.000759"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:06.621512" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.621378" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.621359" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.621733" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.621899" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.621963" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:20:06.623865" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.620196" elapsed="0.003696"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.625255" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.625009" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.625687" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.625449" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.642179" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.642772" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:06.643090" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.627721" elapsed="0.015407"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.625796" elapsed="0.017391"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.643432" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.643223" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.625778" elapsed="0.017773"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.651423" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.645752" elapsed="0.006106"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.645268" elapsed="0.006625"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.645223" elapsed="0.006695"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.654299" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.652209" elapsed="0.002135"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.651989" elapsed="0.002389"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.651957" elapsed="0.002445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.654943" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.654557" elapsed="0.000426"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.655286" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.655057" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.655813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.655518" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.655367" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.655038" elapsed="0.000858"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.656425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.656066" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.656746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.656522" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.657286" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.656994" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.656826" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.656503" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.657509" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.658293" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.658020" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.658465" elapsed="0.002137"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.644303" elapsed="0.016360"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.660835" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.660732" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.660714" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.666648" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.661065" elapsed="0.005612"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.666729" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:06.666914" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.624203" elapsed="0.042737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.667019" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.667192" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.535612" elapsed="0.131629"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.667701" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.667405" elapsed="0.000484"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.667356" elapsed="0.000579"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.668047" elapsed="0.000061"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:06.530697" elapsed="0.137592"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.526539" elapsed="0.141827"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.526520" elapsed="0.141903"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:06.669489" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.669291" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.669742" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.669639" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.669231" elapsed="0.000623"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.670818" elapsed="0.000057"/>
</kw>
<msg time="2026-04-07T17:20:06.671020" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:06.668678" elapsed="0.002402"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.672328" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.671386" elapsed="0.001003"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.674163" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.672683" elapsed="0.001541"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.681429" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.681179" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.681919" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.681672" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.691424" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.691480" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:06 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"291.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:06.691583" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.684130" elapsed="0.007482"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.682096" elapsed="0.009569"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.691937" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.691699" elapsed="0.000351"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.682075" elapsed="0.010006"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.698161" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"291.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.693559" elapsed="0.004734"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.693261" elapsed="0.005082"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.693235" elapsed="0.005142"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.701234" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.698755" elapsed="0.002525"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.698454" elapsed="0.002860"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.698430" elapsed="0.002909"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.701856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.701492" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.702199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.701951" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.702731" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.702434" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.702280" elapsed="0.000512"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.701933" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.703349" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.702990" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.703673" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.703444" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.704216" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.703903" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.703753" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.703426" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.704441" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.705232" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.704939" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.705405" elapsed="0.002145"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.692638" elapsed="0.014975"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.707843" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.707736" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.707716" elapsed="0.000195"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.710708" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.708123" elapsed="0.002614"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.710837" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:20:06.711218" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.676354" elapsed="0.034915"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.711341" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:06.711670" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.674575" elapsed="0.037155"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.713863" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.713088" elapsed="0.000828"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:06.714031" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:20:06.714390" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:06.712176" elapsed="0.002276"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.715148" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.714742" elapsed="0.000468"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.715929" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.715540" elapsed="0.000468"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:06.716234" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:06.716389" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:06.522894" elapsed="0.193520"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:06.716470" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:06.716612" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:06.522118" elapsed="0.194518"/>
</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="PASS" start="2026-04-07T17:20:06.716921" elapsed="0.000245"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.716713" elapsed="0.000492"/>
</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-07T17:20:06.717370" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.717229" 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-07T17:20:06.717581" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.717447" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.716696" elapsed="0.000957"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:06.521844" elapsed="0.195832"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.721772" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.721169" elapsed="0.000652"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:06.721880" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:06.722219" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:06.719656" elapsed="0.002621"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.769033" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.768636" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.769831" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.769546" elapsed="0.000350">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.770004" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.769219" elapsed="0.000810"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.770571" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.770190" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.770886" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:06.771048" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:06.770752" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.771534" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.771288" 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-07T17:20:06.772530" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.772278" elapsed="0.000296"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.773004" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.772728" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.773353" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.773552" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.773720" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.773225" elapsed="0.000552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.773080" elapsed="0.000726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:06.773848" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:06.774021" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:06.771935" elapsed="0.002112"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.771646" elapsed="0.002433"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.774244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.774103" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.771627" elapsed="0.002694"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.774877" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.774458" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.774952" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.768033" elapsed="0.007059"/>
</kw>
<msg time="2026-04-07T17:20:06.775146" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.756429" elapsed="0.018768"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.786969" elapsed="0.000038"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.798452" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.809763" 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-07T17:20:06.809952" elapsed="0.000036"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.810138" 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-07T17:20:06.810532" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.810393" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:06.810378" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.810744" 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-07T17:20:06.810907" 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-07T17:20:06.811084" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:06.810350" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.810249" elapsed="0.000915"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.811302" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.811405" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:20:06.811522" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:06.752489" elapsed="0.059058"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.812762" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.812528" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.812922" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.812196" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.813277" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.813037" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.813801" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.813513" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.813358" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.813017" elapsed="0.000866"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.816057" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.814045" elapsed="0.002038"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:06.816133" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:06.816284" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.811860" elapsed="0.004448"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:06.817493" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.817262" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:06.817644" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:06.816915" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:06.817874" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.817739" elapsed="0.000194"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.817720" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.818114" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.818280" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.818345" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:20:06.820304" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:06.816601" elapsed="0.003729"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.821684" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.821439" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.822136" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.821875" elapsed="0.000304"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.836646" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.837295" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:06.837575" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.824160" elapsed="0.013452"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.822245" elapsed="0.015427"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.837925" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.837709" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.822227" elapsed="0.015851"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.842962" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.839489" elapsed="0.003776"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.839173" elapsed="0.004142"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.839146" elapsed="0.004203"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.846726" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.843750" elapsed="0.003039"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.843428" elapsed="0.003409"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.843404" elapsed="0.003467"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.847659" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.847108" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.848133" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.847793" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.848910" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.848460" elapsed="0.000484"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.848249" elapsed="0.000751"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.847768" elapsed="0.001254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.849534" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.849176" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.849855" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.849629" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.850401" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.850108" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.849935" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.849611" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.850624" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.851414" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.851142" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.851601" elapsed="0.002131"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.838554" elapsed="0.015240"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.853969" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.853862" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.853844" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.859779" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.854193" elapsed="0.005616"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.859862" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:06.860035" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.820627" elapsed="0.039434"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.860124" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.860298" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.731585" elapsed="0.128762"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.860815" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.860511" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.860463" elapsed="0.000544"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.861096" elapsed="0.000061"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:06.726685" elapsed="0.134651"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.722482" elapsed="0.138929"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.722463" elapsed="0.139005"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:20:06.862523" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:06.862327" elapsed="0.000302"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.862767" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.862666" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.862269" elapsed="0.000608"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.863827" elapsed="0.000054"/>
</kw>
<msg time="2026-04-07T17:20:06.864029" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:06.861724" elapsed="0.002364"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.865309" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.864389" elapsed="0.000980"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.866961" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.865658" elapsed="0.001381"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.874213" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.873773" elapsed="0.000487"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.874701" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.874457" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:06.882935" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:06.883007" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:06 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:06 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"367.9 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:06.883111" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:06.876847" elapsed="0.006289"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.874860" elapsed="0.008318"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.883350" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.883204" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.874840" elapsed="0.008595"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.886832" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"367.9 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582406,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.884506" elapsed="0.002428"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.884293" elapsed="0.002693"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.884274" elapsed="0.002738"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.889924" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:06.887293" elapsed="0.002729"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.887070" elapsed="0.003003"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.887053" elapsed="0.003053"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.890847" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.890330" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.891336" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.891011" elapsed="0.000406"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.892126" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.891679" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.891450" elapsed="0.000769"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.890956" elapsed="0.001298"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.893038" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.892471" elapsed="0.000605"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.893495" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.893174" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.894258" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:06.893823" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.893609" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.893148" elapsed="0.001225"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:06.894574" elapsed="0.000707"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:06.895921" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.895504" elapsed="0.000454"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.896189" elapsed="0.002323"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:06.883859" elapsed="0.014716"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.898812" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.898704" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.898683" elapsed="0.000197"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:06.901687" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:06.899090" elapsed="0.002625"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:06.901817" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:20:06.902186" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:06.869149" elapsed="0.033087"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:06.902308" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:20:06.902636" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:06.867387" elapsed="0.035309"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.904854" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:06.904076" elapsed="0.000830"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:06.905024" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:20:06.905385" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582406, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:06.903141" elapsed="0.002305"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.906123" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.905744" elapsed="0.000442"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.906907" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.906516" elapsed="0.000449"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:06.907208" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:06.907364" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:06.718759" elapsed="0.188629"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:06.907444" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:06.907589" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:06.718009" elapsed="0.189604"/>
</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="PASS" start="2026-04-07T17:20:06.907915" elapsed="0.000244"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:06.907691" elapsed="0.000507"/>
</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-07T17:20:06.908364" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.908223" 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-07T17:20:06.908579" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.908442" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.907673" elapsed="0.000980"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:06.717831" elapsed="0.190845"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.319614" elapsed="0.589091"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.908746" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:06.908942" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:20:06.909091" level="INFO">${follower_list} = [2, 3]</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-07T17:20:06.315562" elapsed="0.593555"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.909553" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:20:06.909628" level="INFO">${leader_count} = 1</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-07T17:20:06.909287" elapsed="0.000364"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:06.909929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:06.909721" elapsed="0.000279"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.909703" elapsed="0.000320"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.912074" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:20:06.910154" elapsed="0.001965"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:20:06.912462" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.912278" elapsed="0.000209"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.912533" 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="PASS" start="2026-04-07T17:20:06.313106" elapsed="0.599579"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:20:06.312805" elapsed="0.599926"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:20:05.716301" elapsed="1.196460"/>
</for>
<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="PASS" start="2026-04-07T17:20:05.715829" elapsed="1.196984"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:20:04.458606" elapsed="2.454305"/>
</kw>
<arg>90s</arg>
<arg>1s</arg>
<arg>Check Ovsdb Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:20:04.458085" elapsed="2.454875"/>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="PASS" start="2026-04-07T17:20:04.455691" elapsed="2.457419"/>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:20:04.146962" elapsed="2.766280"/>
</test>
<test id="s1-s2-s1-t29" name="Check Entity Owner Status After Recover" line="143">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:06.916904" elapsed="0.000281"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:06.916647" elapsed="0.000593"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.918215" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.918107" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.918089" 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-07T17:20:06.922785" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.922680" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.922662" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.923846" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:06.923455" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:06.924343" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:06.924040" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:06.924413" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:06.924564" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:06.923085" elapsed="0.001503"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.929764" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.929659" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.929640" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:06.931046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:06.930915" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:06.930897" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:06.931600" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:06.931251" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:06.932068" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:06.931779" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:06.963803" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:06.932627" elapsed="0.031468"/>
</kw>
<msg time="2026-04-07T17:20:06.964275" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:06.964323" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:06.932250" elapsed="0.032107"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.025663" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:06.965017" elapsed="0.060843"/>
</kw>
<msg time="2026-04-07T17:20:07.026056" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:07.026102" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:06.964564" elapsed="0.061572"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.026451" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.026215" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.026195" elapsed="0.000404"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.027153" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:07.026739" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.027519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.027303" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.027285" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:07.027653" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:07.029998" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:07.031452" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:07.032907" elapsed="0.000351"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:07.028536" elapsed="0.004794"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:07.027913" elapsed="0.005532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:06.930611" elapsed="0.102934"/>
</kw>
<msg time="2026-04-07T17:20:07.033645" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.033698" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:06.929992" elapsed="0.103749"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:07.033926" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:07.033818" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.033799" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.034423" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.034757" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.034827" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:06.929320" elapsed="0.105615"/>
</kw>
<msg time="2026-04-07T17:20:07.035059" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.035103" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:06.924938" elapsed="0.110199"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.035458" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.035212" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.035195" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:06.924804" elapsed="0.110752"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.041041" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:07.040913" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.040894" elapsed="0.000215"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.042295" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:07.042189" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.042171" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:07.042851" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:07.042501" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.043297" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:07.043047" elapsed="0.000309"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.071323" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:07.043904" elapsed="0.027585"/>
</kw>
<msg time="2026-04-07T17:20:07.071657" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:07.071703" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.043516" elapsed="0.028222"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.122532" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:07.072308" elapsed="0.050417"/>
</kw>
<msg time="2026-04-07T17:20:07.122891" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:07.122936" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.071904" elapsed="0.051088"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.123288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.123071" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.123052" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.123891" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:07.123525" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.124268" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.124056" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.124037" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:07.124401" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:07.126684" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:20:07.128136" elapsed="0.000486"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:07.129542" elapsed="0.000384"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:07.125249" elapsed="0.004765"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:07.124663" elapsed="0.005466"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:07.041862" elapsed="0.088367"/>
</kw>
<msg time="2026-04-07T17:20:07.130317" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.130360" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.041255" elapsed="0.089140"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:07.130576" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:07.130471" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.130452" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.131058" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.131385" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.131454" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:07.040570" elapsed="0.090991"/>
</kw>
<msg time="2026-04-07T17:20:07.131691" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.131735" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.035812" elapsed="0.095958"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.132120" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.131845" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.131828" elapsed="0.000371"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:07.035676" elapsed="0.096546"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.137540" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:07.137433" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.137414" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.138784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:07.138680" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.138662" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:07.139358" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:07.139004" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.139782" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:07.139535" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.168936" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:07.140424" elapsed="0.028696"/>
</kw>
<msg time="2026-04-07T17:20:07.169284" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:07.169330" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.139960" elapsed="0.029404"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:07.226604" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:07.169912" elapsed="0.056891"/>
</kw>
<msg time="2026-04-07T17:20:07.227001" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:07.227048" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.169529" elapsed="0.057554"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.227375" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.227160" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.227141" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.228012" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "S "t "a "t "[78Cu "[A[78Cs
 "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:07.227617" elapsed="0.000475"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.228367" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.228158" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.228140" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:07.228498" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:07.230785" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:20:07.232240" elapsed="0.000457"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:07.233696" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:07.229340" elapsed="0.004771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:07.228745" elapsed="0.005479"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:07.138380" elapsed="0.095943"/>
</kw>
<msg time="2026-04-07T17:20:07.234413" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.234456" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.137755" elapsed="0.096737"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:07.234676" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:07.234569" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.234550" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.235152" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.235480" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.235550" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:07.137094" elapsed="0.098563"/>
</kw>
<msg time="2026-04-07T17:20:07.235748" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:07.235790" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.132474" elapsed="0.103350"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.236171" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:07.235899" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.235882" elapsed="0.000367"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:07.132341" elapsed="0.103930"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:06.924640" elapsed="0.311660"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:06.922327" elapsed="0.314026"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:06.917807" elapsed="0.318601"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:06.917385" elapsed="0.319067"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:06.914326" elapsed="0.322177"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:20:07.270255" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:07.269860" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.270732" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:07.270435" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:07.270801" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:07.270952" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:07.269502" elapsed="0.001491"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:07.275494" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:07.275310" elapsed="0.000210"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:07.275919" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.275696" elapsed="0.000312">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.276266" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.276450" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.276605" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.276763" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.276940" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.277132" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.277307" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.277465" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.287453" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.287647" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.297540" 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-07T17:20:07.297731" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.297802" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.274759" elapsed="0.023166">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:07.298050" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:07.298094" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.274208" elapsed="0.023908"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.298304" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:07.298197" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:07.298179" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:07.299659" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.300347" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:07.300039" elapsed="0.000333"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:07.301239" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:07.300942" elapsed="0.000323"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:07.301312" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:07.301459" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:07.300609" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.302016" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:07.301636" elapsed="0.000407"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.302583" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:07.302238" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:07.303011" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:07.323819" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:07.302766" elapsed="0.022804">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.325772" 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-07T17:20:07.325940" 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-07T17:20:07.326124" 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-07T17:20:07.326289" 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-07T17:20:07.326455" 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-07T17:20:07.326613" 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-07T17:20:07.326869" 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-07T17:20:07.327054" 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-07T17:20:07.327215" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:07.326748" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.326678" 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-07T17:20:07.327428" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.327486" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.299123" elapsed="0.028470">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:07.327704" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:07.327747" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:07.298512" elapsed="0.029257"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:07.328394" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.328077" elapsed="0.000376">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:07.327850" elapsed="0.000666">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:07.327832" elapsed="0.000716">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.328592" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.273650" elapsed="0.055038">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.328859" elapsed="0.000062"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.329090" elapsed="0.000022"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.329154" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:07.271291" elapsed="0.057962">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:07.329427" 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-07T17:20:07.329598" 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-07T17:20:07.329761" 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-07T17:20:07.329918" 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-07T17:20:07.330101" 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-07T17:20:07.330260" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:07.330344" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.268888" elapsed="0.061557">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:08.362282" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:08.361820" elapsed="0.000493"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:08.362793" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:08.362476" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:08.362865" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:20:08.363060" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:08.361440" 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-07T17:20:08.367600" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:08.367412" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:08.368018" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.367771" elapsed="0.000318">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.368251" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.368445" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.368599" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.368756" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.368958" elapsed="0.000034"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.369190" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.369362" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.369516" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.379273" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.379466" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.389379" 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-07T17:20:08.389570" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.389636" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.366863" elapsed="0.022887">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:08.389860" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:08.389904" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:08.366315" elapsed="0.023611"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.390148" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:08.390035" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:08.390016" 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-07T17:20:08.391508" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:08.392194" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:08.391864" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:08.393256" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:08.392732" elapsed="0.000551"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:08.393331" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:08.393480" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:08.392403" elapsed="0.001102"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:08.394053" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:08.393661" elapsed="0.000418"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:08.394577" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:08.394231" elapsed="0.000372"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:08.394995" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:08.406682" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:08.394760" elapsed="0.015777">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.411056" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.411441" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.411799" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.412194" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.412567" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.412922" elapsed="0.000087"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.413549" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.413920" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.414302" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:08.413272" elapsed="0.001148"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.413119" elapsed="0.001359"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.414776" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.414906" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.390955" elapsed="0.024229">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:08.415434" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:08.415530" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:08.390360" elapsed="0.025222"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:08.417031" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.416263" elapsed="0.000910">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:08.415762" elapsed="0.001550">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:08.415722" elapsed="0.001662">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.417486" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.365758" elapsed="0.051955">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.417999" 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-07T17:20:08.418162" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.418224" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:08.363391" elapsed="0.054937">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:08.418526" 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-07T17:20:08.418699" 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-07T17:20:08.418869" 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-07T17:20:08.419043" 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-07T17:20:08.419208" 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-07T17:20:08.419367" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:08.419427" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:08.360712" elapsed="0.058814">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:09.449466" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:09.448913" elapsed="0.000591"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:09.450020" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:09.449678" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:09.450098" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:20:09.450287" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:09.448515" elapsed="0.001797"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:09.455365" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:09.455169" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:09.455788" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.455542" elapsed="0.000332">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456054" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456293" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456449" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456608" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456782" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.456942" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.457134" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.457292" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.467179" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.467457" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.477291" 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-07T17:20:09.477486" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.477554" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.454612" elapsed="0.023065">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:09.477790" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:09.477832" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:09.454041" elapsed="0.023814"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.478085" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:09.477947" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:09.477925" 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-07T17:20:09.479471" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:09.480184" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:09.479833" elapsed="0.000378"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:09.481012" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:09.480729" elapsed="0.000313"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:09.481089" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:09.481238" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:09.480394" elapsed="0.000868"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:09.481790" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:09.481418" elapsed="0.000398"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:09.482328" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:09.481983" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:09.482748" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:09.493860" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:09.482510" elapsed="0.013929">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.496695" elapsed="0.000038"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.497112" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.497477" 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-07T17:20:09.497833" 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-07T17:20:09.498236" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.498591" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.499465" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.499846" 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-07T17:20:09.500247" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:09.499149" elapsed="0.001219"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.498942" elapsed="0.001488"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.500736" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.500867" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.478914" elapsed="0.022252">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:09.501424" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:09.501520" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:09.478304" elapsed="0.023267"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:09.502998" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.502263" elapsed="0.000872">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:09.501754" elapsed="0.001521">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:09.501713" elapsed="0.001634">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.503449" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.453478" elapsed="0.050188">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.504080" elapsed="0.000050"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.504658" elapsed="0.000053"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.504824" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:09.450615" elapsed="0.054371">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:09.505155" 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-07T17:20:09.505328" 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-07T17:20:09.505492" 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-07T17:20:09.505649" 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-07T17:20:09.505811" 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-07T17:20:09.505983" elapsed="0.000062"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:09.506092" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:09.447651" elapsed="0.058542">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:10.536112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:10.535628" elapsed="0.000517"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:10.536627" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:10.536311" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:10.536702" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:20:10.536876" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:10.535236" 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-07T17:20:10.541647" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:10.541452" elapsed="0.000222"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:10.542099" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.541839" elapsed="0.000573">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.542582" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.542787" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.542946" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.543182" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.543366" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.543542" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.543716" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.543874" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.554026" elapsed="0.000039"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.554256" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.564378" 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-07T17:20:10.564578" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.564722" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.540844" elapsed="0.024016">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:10.565006" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:10.565065" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:10.540286" elapsed="0.024805"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.565320" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:10.565188" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:10.565166" 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-07T17:20:10.566791" elapsed="0.000242"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:10.567534" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:10.567211" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:10.568367" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:10.568099" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:10.568440" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:10.568591" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:10.567743" elapsed="0.000873"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:10.569161" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:10.568773" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:10.569686" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:10.569342" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:10.570132" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:10.580537" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:10.569876" elapsed="0.012863">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.583038" 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-07T17:20:10.583308" 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-07T17:20:10.583538" 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-07T17:20:10.583763" 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-07T17:20:10.584036" 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-07T17:20:10.584265" 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-07T17:20:10.584637" 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-07T17:20:10.584872" 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-07T17:20:10.585139" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:10.584463" elapsed="0.000752"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.584363" elapsed="0.000891"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.585445" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.585527" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.566226" elapsed="0.019516">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:10.585914" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:10.586006" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:10.565540" elapsed="0.020502"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:10.586925" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.586464" elapsed="0.000572">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:10.586162" elapsed="0.000996">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:10.586135" elapsed="0.001375">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.587580" elapsed="0.000023"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.539719" elapsed="0.048002">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.588010" elapsed="0.000035"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.588247" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.588333" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:10.537217" elapsed="0.051253">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.588699" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.588937" 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-07T17:20:10.589188" 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-07T17:20:10.589405" 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-07T17:20:10.589647" elapsed="0.000036"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:10.589908" elapsed="0.000034"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:10.590034" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:10.534472" elapsed="0.055708">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:11.619231" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:11.618687" elapsed="0.000581"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:11.619763" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:11.619441" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:11.619838" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:20:11.620049" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:11.618141" elapsed="0.001933"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:11.624700" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:11.624424" elapsed="0.000302"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:11.625146" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.624878" elapsed="0.000350">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.625393" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.625659" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.625822" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.625995" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.626176" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.626336" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.626507" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.626661" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.636693" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.636889" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.646687" 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-07T17:20:11.646878" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.646943" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.623872" elapsed="0.023207">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:11.647193" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:11.647236" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:11.623304" elapsed="0.023955"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.647497" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:11.647347" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:11.647328" 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-07T17:20:11.648883" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:11.649573" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:11.649260" elapsed="0.000338"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:11.650429" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:11.650166" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:11.650501" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:11.650648" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:11.649815" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:11.651214" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:11.650828" elapsed="0.000412"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:11.651738" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:11.651395" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:11.652182" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:11.670109" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:11.651926" elapsed="0.021614">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.673995" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.674375" 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-07T17:20:11.674729" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.675119" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.675534" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.675884" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.676500" 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-07T17:20:11.676867" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.677244" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:11.676224" elapsed="0.001140"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.676067" elapsed="0.001356"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.677739" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.677872" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.648345" elapsed="0.029790">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:11.678391" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:11.678487" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:11.647717" elapsed="0.030820"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:11.680035" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.679307" elapsed="0.000861">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:11.678805" elapsed="0.001500">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:11.678763" elapsed="0.001612">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.680476" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.622748" elapsed="0.057942">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.681099" elapsed="0.000050"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.681460" elapsed="0.000043"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.681594" elapsed="0.000031"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:11.620376" elapsed="0.061491">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.682289" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:11.682668" 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-07T17:20:11.683017" 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-07T17:20:11.683178" 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-07T17:20:11.683338" 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-07T17:20:11.683494" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:11.683554" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:11.617303" elapsed="0.066347">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:12.713613" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:12.713123" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:12.714154" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:12.713816" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:12.714228" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:20:12.714409" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:12.712709" 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-07T17:20:12.719053" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:12.718846" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:12.719468" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.719229" elapsed="0.000317">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.719708" elapsed="0.000152"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720096" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720256" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720414" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720589" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720746" elapsed="0.000029"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.720932" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.721107" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.730936" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.731143" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.741065" 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-07T17:20:12.741255" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.741321" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.718313" elapsed="0.023124">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:12.741548" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:12.741591" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:12.717744" elapsed="0.023870"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.741816" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:12.741700" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:12.741680" 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-07T17:20:12.743213" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:12.743887" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:12.743572" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:12.744904" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:12.744631" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:12.745031" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:12.745183" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:12.744134" elapsed="0.001073"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:12.745733" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:12.745362" elapsed="0.000396"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:12.746281" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:12.745916" elapsed="0.000391"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:12.746699" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:12.756168" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:12.746465" elapsed="0.012369">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.759118" 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-07T17:20:12.759358" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.759585" 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-07T17:20:12.759809" 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-07T17:20:12.760080" 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-07T17:20:12.760308" 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-07T17:20:12.760681" 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-07T17:20:12.760914" 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-07T17:20:12.761164" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:12.760507" elapsed="0.000731"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.760407" elapsed="0.000869"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.761463" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.761544" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.742655" elapsed="0.019036">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:12.761846" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:12.761909" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:12.742051" elapsed="0.019890"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:12.762807" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.762370" elapsed="0.000528">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:12.762077" elapsed="0.000933">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:12.762052" elapsed="0.001005">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.763121" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.717204" elapsed="0.046116">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.763614" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.763840" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.763925" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:12.714816" elapsed="0.049312">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.764359" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:12.764601" 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-07T17:20:12.764830" 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-07T17:20:12.765057" 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-07T17:20:12.765221" 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-07T17:20:12.765379" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:12.765439" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:12.711944" elapsed="0.053592">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:13.795085" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:13.794577" elapsed="0.000543"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:13.795606" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:13.795288" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:13.795680" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:20:13.795860" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:13.794182" elapsed="0.001702"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:13.800704" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:13.800511" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:13.801132" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.800878" elapsed="0.000335">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.801375" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.801579" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.801731" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.801888" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.802185" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.802403" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.802614" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.802808" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.814586" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.814783" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.824461" 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-07T17:20:13.824652" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.824718" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.799957" elapsed="0.024880">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:13.824950" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:13.825009" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:13.799401" elapsed="0.025632"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.825240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:13.825122" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:13.825102" 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-07T17:20:13.826640" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:13.827377" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:13.827016" elapsed="0.000388"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:13.828209" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:13.827920" elapsed="0.000317"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:13.828283" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:13.828431" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:13.827588" elapsed="0.000867"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:13.828991" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:13.828609" elapsed="0.000410"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:13.829516" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:13.829171" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:13.829925" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:13.845336" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:13.829696" elapsed="0.017659">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.847577" 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-07T17:20:13.847746" 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-07T17:20:13.847909" 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-07T17:20:13.848110" 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-07T17:20:13.848280" 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-07T17:20:13.848437" 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-07T17:20:13.848716" 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-07T17:20:13.848884" 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-07T17:20:13.849061" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:13.848589" elapsed="0.000525"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.848511" 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-07T17:20:13.849282" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.849339" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.826097" elapsed="0.023351">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:13.849561" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:13.849604" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:13.825453" elapsed="0.024174"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:13.850272" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.849920" elapsed="0.000412">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:13.849709" elapsed="0.000684">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:13.849691" elapsed="0.000734">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.850469" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.798837" elapsed="0.051729">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.850738" 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-07T17:20:13.850901" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.850960" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:13.796202" elapsed="0.054876">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:13.851288" 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-07T17:20:13.851462" 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-07T17:20:13.851626" 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-07T17:20:13.851781" 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-07T17:20:13.851949" 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-07T17:20:13.852127" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:13.852188" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:13.793374" elapsed="0.058912">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:14.881622" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:14.881137" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:14.882152" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:14.881821" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:14.882226" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:20:14.882399" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:14.880726" 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-07T17:20:14.887165" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:14.886957" elapsed="0.000236"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:14.887572" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.887339" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.887804" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888047" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888206" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888364" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888540" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888701" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.888872" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.889042" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.898770" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.899050" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.908794" 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-07T17:20:14.908996" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.909064" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.886425" elapsed="0.022755">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:14.909293" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:14.909335" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:14.885849" elapsed="0.023509"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.909559" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:14.909446" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:14.909426" 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-07T17:20:14.910919" elapsed="0.000232"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:14.911614" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:14.911302" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:14.912467" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:14.912203" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:14.912542" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:14.912688" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:14.911819" elapsed="0.000893"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:14.913250" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:14.912867" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:14.913765" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:14.913426" elapsed="0.000365"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:14.914190" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:14.926519" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:14.913945" elapsed="0.014650">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.928853" 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-07T17:20:14.929114" 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-07T17:20:14.929339" 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-07T17:20:14.929562" 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-07T17:20:14.929789" 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-07T17:20:14.930028" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.930468" 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-07T17:20:14.930699" 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-07T17:20:14.930915" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:14.930292" elapsed="0.000717"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.930190" 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-07T17:20:14.931239" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.931321" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.910384" elapsed="0.021089">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:14.931630" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:14.931691" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:14.909769" elapsed="0.021954"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:14.932613" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.932169" elapsed="0.000526">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:14.931837" elapsed="0.000944">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:14.931812" elapsed="0.001014">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.932888" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.885311" elapsed="0.047733">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.933285" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.933509" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.933592" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:14.882720" elapsed="0.051006">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.933949" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.934215" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:14.934441" 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-07T17:20:14.934657" 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-07T17:20:14.934876" 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-07T17:20:14.935112" elapsed="0.000080"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:14.935254" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:14.879786" elapsed="0.055604">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:15.966905" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:15.966401" elapsed="0.000639"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:15.967542" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:15.967218" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:15.967617" elapsed="0.000050"/>
</return>
<msg time="2026-04-07T17:20:15.967809" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:15.965991" elapsed="0.001842"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:15.972850" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:15.972646" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:15.973284" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:15.973043" elapsed="0.000316">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.973799" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974027" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974189" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974349" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974530" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974703" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.974882" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.975058" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.985193" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.985389" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:15.995446" 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-07T17:20:15.995645" elapsed="0.000028"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:15.995789" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:15.972102" elapsed="0.023807">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:15.996040" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:15.996087" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:15.971474" elapsed="0.024640"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:15.996323" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:15.996204" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:15.996183" 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-07T17:20:15.997824" elapsed="0.000284"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:15.998579" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:15.998263" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:15.999429" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:15.999161" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:15.999503" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:15.999660" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:15.998796" elapsed="0.000891"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:16.000234" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:15.999845" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:16.000773" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:16.000415" elapsed="0.000385"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:16.001201" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:16.011501" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:16.000956" elapsed="0.012955">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.014242" 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-07T17:20:16.014482" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.014742" 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-07T17:20:16.014998" elapsed="0.000031"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.015237" 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-07T17:20:16.015460" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.015844" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.016140" elapsed="0.000037"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.016396" elapsed="0.000031"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:16.015663" elapsed="0.000809"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:16.015555" elapsed="0.000956"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.016715" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:16.016802" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:15.997210" elapsed="0.019827">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:16.017202" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:16.017264" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:15.996539" elapsed="0.020757"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:16.018333" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:16.017771" elapsed="0.000661">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:16.017413" elapsed="0.001124">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:16.017387" elapsed="0.001204">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:16.018675" elapsed="0.000028"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:15.970773" elapsed="0.048086">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.019163" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.019399" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:16.019487" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:15.968196" elapsed="0.051429">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.019851" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:16.020144" 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-07T17:20:16.020403" 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-07T17:20:16.020620" 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-07T17:20:16.020842" 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-07T17:20:16.021101" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:16.021210" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:15.965089" elapsed="0.056258">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:17.052643" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:17.052175" elapsed="0.000501"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:17.053173" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:17.052842" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:17.053248" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:20:17.053421" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:17.051695" 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-07T17:20:17.058033" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:17.057827" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:17.058443" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.058209" elapsed="0.000307">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.058677" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.058878" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059050" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059224" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059401" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059558" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059729" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.059885" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.070008" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.070217" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.080103" 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-07T17:20:17.080295" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.080359" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.057290" elapsed="0.023194">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:17.080602" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:17.080646" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:17.056693" elapsed="0.023975"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.080918" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:17.080756" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:17.080736" elapsed="0.000269"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:17.082328" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:17.083015" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:17.082689" elapsed="0.000355"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:17.084021" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:17.083576" elapsed="0.000472"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:17.084097" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:17.084246" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:17.083241" elapsed="0.001029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:17.084792" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:17.084424" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:17.085334" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:17.084986" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:17.085754" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:17.095325" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:17.085517" elapsed="0.011593">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.097291" 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-07T17:20:17.097457" 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-07T17:20:17.097615" 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-07T17:20:17.097774" 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-07T17:20:17.097938" 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-07T17:20:17.098114" 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-07T17:20:17.098380" 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-07T17:20:17.098547" 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-07T17:20:17.098702" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:17.098256" elapsed="0.000498"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.098185" elapsed="0.000598"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.098917" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.098988" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.081775" elapsed="0.017329">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:17.099226" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:17.099270" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:17.081154" elapsed="0.018139"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:17.099943" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.099624" elapsed="0.000396">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:17.099413" elapsed="0.000669">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:17.099394" elapsed="0.000721">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.100161" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.056151" elapsed="0.044107">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.100429" 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-07T17:20:17.100593" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.100653" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:17.053745" elapsed="0.047004">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:17.100911" 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-07T17:20:17.101104" 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-07T17:20:17.101271" 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-07T17:20:17.101427" 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-07T17:20:17.101589" 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-07T17:20:17.101748" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:17.101808" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:17.050927" elapsed="0.050979">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:18.132228" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:18.131741" elapsed="0.000518"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:18.132754" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:18.132426" elapsed="0.000354"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:18.132828" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:20:18.133013" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:18.131355" 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-07T17:20:18.137958" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:18.137771" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:18.138500" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.138149" elapsed="0.000424">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.138737" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.138938" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139116" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139281" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139457" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139615" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139786" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.139943" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.149728" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.149921" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.160027" 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-07T17:20:18.160221" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.160288" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.137227" elapsed="0.023177">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:18.160517" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:18.160560" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:18.136640" elapsed="0.023966"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.160815" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:18.160696" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:18.160675" 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-07T17:20:18.162201" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:18.162869" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:18.162560" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:18.163693" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:18.163432" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:18.163823" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:18.164011" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:18.163097" elapsed="0.000941"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:18.164561" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:18.164194" elapsed="0.000403"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:18.165114" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:18.164751" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:18.165525" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:18.177012" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:18.165298" elapsed="0.014127">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.179681" 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-07T17:20:18.179918" 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-07T17:20:18.180181" 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-07T17:20:18.180407" 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-07T17:20:18.180680" 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-07T17:20:18.180908" 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-07T17:20:18.181419" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.181793" 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-07T17:20:18.182174" elapsed="0.000048"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:18.181128" elapsed="0.001167"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.181028" elapsed="0.001326"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.182655" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.182787" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.161646" elapsed="0.021409">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:18.183311" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:18.183411" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:18.161045" elapsed="0.022418"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:18.184866" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.184141" elapsed="0.000888">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:18.183644" elapsed="0.001539">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:18.183604" elapsed="0.001661">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.185381" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.136063" elapsed="0.049540">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.186103" elapsed="0.000051"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.186484" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.186623" elapsed="0.000034"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:18.133422" elapsed="0.053423">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.187236" 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-07T17:20:18.187623" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.188017" elapsed="0.000047"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.188371" elapsed="0.000044"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.189509" elapsed="0.000164"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:18.190108" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:18.190269" elapsed="0.000051"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:18.130619" elapsed="0.059936">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:19.219360" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:19.218847" elapsed="0.000546"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:19.219876" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:19.219562" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:19.219949" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:19.220145" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:19.218458" 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-07T17:20:19.224713" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:19.224523" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:19.225136" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.224887" elapsed="0.000550">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.225602" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.225806" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226001" elapsed="0.000023"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226166" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226453" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226616" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226790" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.226948" elapsed="0.000038"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.236714" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.236907" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.246693" 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-07T17:20:19.246883" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.246949" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.223987" elapsed="0.023100">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:19.247200" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:19.247243" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:19.223418" elapsed="0.023848"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.247468" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:19.247353" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:19.247333" 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-07T17:20:19.248830" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:19.249516" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:19.249205" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:19.250381" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:19.250111" elapsed="0.000296"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:19.250454" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:19.250602" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:19.249722" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:19.251164" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:19.250782" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:19.251690" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:19.251348" elapsed="0.000368"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:19.252123" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:19.263672" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:19.251873" elapsed="0.014330">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.266702" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.267114" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.267478" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.267839" 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-07T17:20:19.268241" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.268597" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.269212" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.269584" 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-07T17:20:19.269948" elapsed="0.000073"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:19.268898" elapsed="0.001199"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.268746" elapsed="0.001410"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.270459" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.270590" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.248295" elapsed="0.022535">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:19.271111" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:19.271213" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:19.247680" elapsed="0.023585"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:19.272647" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.271918" elapsed="0.000860">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:19.271449" elapsed="0.001467">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:19.271409" elapsed="0.001609">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.273123" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.222856" elapsed="0.050488">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.273727" elapsed="0.000632"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.274700" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.274840" elapsed="0.000033"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:19.220467" elapsed="0.054697">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:19.275378" 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-07T17:20:19.275553" 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-07T17:20:19.275717" 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-07T17:20:19.275874" 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-07T17:20:19.276055" 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-07T17:20:19.276216" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:19.276277" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:19.217631" elapsed="0.058745">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:20.307059" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:20.306633" elapsed="0.000468"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:20.307563" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:20.307258" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:20.307659" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:20:20.307825" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:20.306265" elapsed="0.001584"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:20.312423" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:20.312243" elapsed="0.000208"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:20.312810" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.312594" elapsed="0.000277">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313045" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313234" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313386" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313544" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313718" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.313874" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.314059" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.314215" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.324091" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.324332" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.334051" 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-07T17:20:20.334239" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.334305" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.311698" elapsed="0.022716">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:20.334521" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:20.334564" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:20.311135" elapsed="0.023452"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.334780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:20.334669" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:20.334651" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:20.336178" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:20.336836" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:20.336535" elapsed="0.000327"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:20.337656" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:20.337396" elapsed="0.000287"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:20.337729" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:20.337874" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:20.337058" elapsed="0.000840"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:20.338432" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:20.338066" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:20.338948" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:20.338610" elapsed="0.000378"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:20.339370" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:20.353367" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:20.339159" elapsed="0.017991">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.357561" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.357937" elapsed="0.000078"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.358330" 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-07T17:20:20.358682" elapsed="0.000043"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.359076" 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-07T17:20:20.359445" elapsed="0.000043"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.360129" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.360499" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.360845" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:20.359821" elapsed="0.001139"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.359666" elapsed="0.001380"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.361348" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.361476" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.335624" elapsed="0.026095">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:20.361996" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:20.362097" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:20.335005" elapsed="0.027145"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:20.363613" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.362830" elapsed="0.000913">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:20.362331" elapsed="0.001548">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:20.362291" elapsed="0.001657">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.364088" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.310492" elapsed="0.053738">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.364402" 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-07T17:20:20.364563" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.364623" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:20.308157" elapsed="0.056563">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:20.364880" 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-07T17:20:20.365068" 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-07T17:20:20.365237" 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-07T17:20:20.365393" 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-07T17:20:20.365551" 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-07T17:20:20.365706" elapsed="0.000060"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:20.365811" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:20.305515" elapsed="0.060394">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:21.396948" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:21.396505" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:21.397468" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:21.397160" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:21.397541" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:20:21.397708" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:21.396090" elapsed="0.001643"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:21.402264" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:21.402076" elapsed="0.000213"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:21.402666" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.402440" elapsed="0.000293">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.402894" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403108" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403264" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403421" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403598" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403756" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.403927" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.404099" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.413943" elapsed="0.000038"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.414149" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.423790" elapsed="0.000025"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.423991" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.424116" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.401532" elapsed="0.022728">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:21.424378" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:21.424421" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:21.400962" elapsed="0.023481"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.424642" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:21.424529" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:21.424510" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:21.426012" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:21.426679" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:21.426372" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:21.427663" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:21.427389" elapsed="0.000299"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:21.427737" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:21.427884" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:21.426887" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:21.428473" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:21.428078" elapsed="0.000422"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:21.429014" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:21.428653" elapsed="0.000388"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:21.429426" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:21.439213" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:21.429200" elapsed="0.012732">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.442373" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.442747" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.443135" 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-07T17:20:21.443494" 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-07T17:20:21.443862" 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-07T17:20:21.444272" elapsed="0.000060"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.444876" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.445292" 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-07T17:20:21.445643" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:21.444596" elapsed="0.001163"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.444445" elapsed="0.001371"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.446141" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.446278" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.425463" elapsed="0.021132">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:21.446850" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:21.446945" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:21.424852" elapsed="0.022175"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:21.448468" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.447685" elapsed="0.000914">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:21.447215" elapsed="0.001522">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:21.447175" elapsed="0.001632">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.448907" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.400418" elapsed="0.048740">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.449475" 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-07T17:20:21.449637" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.449698" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:21.398048" elapsed="0.051747">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.449957" elapsed="0.000034"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:21.450146" 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-07T17:20:21.450310" 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-07T17:20:21.450465" 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-07T17:20:21.450625" 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-07T17:20:21.450782" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:21.450842" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:21.395372" elapsed="0.055567">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:22.481681" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:22.481146" elapsed="0.000570"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:22.482228" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:22.481888" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:22.482309" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:20:22.482495" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:22.480603" elapsed="0.001916"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:22.487397" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:22.487203" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:22.487810" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.487570" elapsed="0.000320">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488066" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488278" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488433" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488589" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488763" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.488921" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.489120" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.489287" elapsed="0.000022"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.499326" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.499521" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.509145" 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-07T17:20:22.509356" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.509424" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.486653" elapsed="0.022887">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:22.509654" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:22.509696" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:22.486088" elapsed="0.023630"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.509994" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:22.509810" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:22.509789" elapsed="0.000279"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:22.511378" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:22.512064" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:22.511737" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:22.512873" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:22.512608" elapsed="0.000293"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:22.512948" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:20:22.513113" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:22.512273" elapsed="0.000864"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:22.513674" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:22.513304" elapsed="0.000396"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:22.514216" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:22.513853" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:22.514640" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:22.527655" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:22.514400" elapsed="0.016417">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.531257" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.531639" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.532028" 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-07T17:20:22.532394" 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-07T17:20:22.532765" 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-07T17:20:22.533169" elapsed="0.000049"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.533791" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.534199" 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-07T17:20:22.534555" elapsed="0.000044"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:22.533510" elapsed="0.001162"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.533348" elapsed="0.001385"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.535065" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.535199" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.510827" elapsed="0.024611">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:22.535691" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:22.535785" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:22.510217" elapsed="0.025619"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:22.537407" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.536618" elapsed="0.000925">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:22.536138" elapsed="0.001544">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:22.536094" elapsed="0.001659">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.537853" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.485527" elapsed="0.052573">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.538496" 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-07T17:20:22.538661" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.538725" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:22.482824" elapsed="0.056026">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:22.539066" 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-07T17:20:22.539280" 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-07T17:20:22.539478" 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-07T17:20:22.539662" 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-07T17:20:22.539835" 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-07T17:20:22.540007" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:22.540069" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:22.479679" elapsed="0.060486">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:23.571545" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:23.570874" elapsed="0.000714"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:23.572218" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:23.571804" elapsed="0.000449"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:23.572315" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:23.572548" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:23.570339" elapsed="0.002240"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:23.577486" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:23.577292" elapsed="0.000220"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:23.577906" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.577661" elapsed="0.000344">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.578466" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.578688" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.578846" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.579021" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.579209" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.579370" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.579546" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.579702" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.589682" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.589880" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.599753" 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-07T17:20:23.599947" elapsed="0.000035"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.600030" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.576741" elapsed="0.023416">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:23.600274" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:23.600317" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:23.576170" elapsed="0.024170"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.600558" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:23.600431" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:23.600410" 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-07T17:20:23.601943" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:23.602652" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:23.602339" elapsed="0.000338"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:23.603475" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:23.603211" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:23.603598" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:23.603751" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:23.602858" elapsed="0.000918"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:23.604322" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:23.603933" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:23.604963" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:23.604501" elapsed="0.000507"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:23.605409" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:23.621703" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:23.605172" elapsed="0.018373">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.623729" 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-07T17:20:23.623899" 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-07T17:20:23.624080" 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-07T17:20:23.624248" 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-07T17:20:23.624420" 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-07T17:20:23.624579" 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-07T17:20:23.624858" 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-07T17:20:23.625041" 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-07T17:20:23.625201" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:23.624732" elapsed="0.000521"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.624654" 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-07T17:20:23.625422" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.625480" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.601406" elapsed="0.024183">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:23.625703" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:23.625747" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:23.600775" elapsed="0.024995"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:23.626411" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.626078" elapsed="0.000393">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:23.625853" elapsed="0.000680">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:23.625834" elapsed="0.000733">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.626612" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.575607" elapsed="0.051103">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.626929" 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-07T17:20:23.627114" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.627176" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:23.573097" elapsed="0.054177">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:23.627439" 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-07T17:20:23.627614" 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-07T17:20:23.627779" 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-07T17:20:23.627934" 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-07T17:20:23.628113" 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-07T17:20:23.628274" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:23.628333" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:23.569290" elapsed="0.059141">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:24.659200" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:24.658691" elapsed="0.000544"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:24.659714" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:24.659403" elapsed="0.000337"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:24.659786" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:20:24.659963" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:24.658301" elapsed="0.001702"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:24.664583" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:24.664393" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:24.665008" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.664756" elapsed="0.000332">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.665251" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.665457" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.665612" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.665770" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.666045" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.666209" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.666381" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.666538" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.676473" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.676668" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.686393" 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-07T17:20:24.686583" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.686649" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.663840" elapsed="0.022929">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:24.686881" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:24.686923" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:24.663281" elapsed="0.023665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.687168" elapsed="0.000043"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:24.687049" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:24.687028" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:24.688591" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:24.689277" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:24.688949" elapsed="0.000356"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:24.690322" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:24.689862" elapsed="0.000487"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:24.690398" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:24.690547" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:24.689519" elapsed="0.001053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:24.691116" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:24.690728" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:24.691666" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:24.691312" elapsed="0.000380"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:24.692104" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:24.703954" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:24.691849" elapsed="0.014438">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.706598" 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-07T17:20:24.706836" 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-07T17:20:24.707091" elapsed="0.000030"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.707340" 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-07T17:20:24.707575" 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-07T17:20:24.707796" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.708196" 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-07T17:20:24.708430" 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-07T17:20:24.708649" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:24.708020" elapsed="0.000702"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.707893" elapsed="0.000867"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.708950" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.709051" elapsed="0.000022"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.688055" elapsed="0.021148">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:24.709359" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:24.709424" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:24.687430" elapsed="0.022028"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:24.710327" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.709864" elapsed="0.000546">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:24.709572" elapsed="0.000923">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:24.709547" elapsed="0.000993">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.710602" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.662694" elapsed="0.048045">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.710997" 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-07T17:20:24.711239" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.711324" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:24.660300" elapsed="0.051160">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.711752" 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-07T17:20:24.712018" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:24.712394" 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-07T17:20:24.712618" 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-07T17:20:24.712780" 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-07T17:20:24.712938" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:24.713028" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:24.657527" elapsed="0.055603">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:25.743735" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:25.743228" elapsed="0.000542"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:25.744286" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:25.743940" elapsed="0.000372"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:25.744361" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:20:25.744543" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:25.742819" elapsed="0.001748"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:25.749480" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:25.749287" elapsed="0.000219"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:25.749899" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.749656" elapsed="0.000341">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.750164" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.750373" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.750533" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.750692" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.750867" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.751045" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.751220" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.751376" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.761233" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.761516" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.771300" 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-07T17:20:25.771491" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.771559" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.748734" elapsed="0.022948">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:25.771795" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:25.771838" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:25.748158" elapsed="0.023702"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.772106" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:25.771950" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:25.771929" 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-07T17:20:25.773491" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:25.774176" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:25.773848" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:25.774995" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:25.774718" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:25.775072" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:25.775220" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:25.774384" elapsed="0.000861"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:25.775768" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:25.775401" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:25.776318" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:25.775947" elapsed="0.000396"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:25.776735" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:25.786861" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:25.776503" elapsed="0.013002">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.789759" 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-07T17:20:25.790023" 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-07T17:20:25.790252" 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-07T17:20:25.790475" 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-07T17:20:25.790703" 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-07T17:20:25.790923" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.791379" 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-07T17:20:25.791611" 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-07T17:20:25.791828" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:25.791200" elapsed="0.000702"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.791095" elapsed="0.000845"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.792166" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.792250" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.772936" elapsed="0.019463">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:25.792558" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:25.792618" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:25.772325" elapsed="0.020325"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:25.793522" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.793074" elapsed="0.000532">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:25.792764" elapsed="0.000928">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:25.792739" elapsed="0.000998">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.793800" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.747574" elapsed="0.046362">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.794199" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.794423" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.794508" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:25.744867" elapsed="0.049777">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.794869" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.795131" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.795361" 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-07T17:20:25.795578" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:25.795804" 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-07T17:20:25.796043" elapsed="0.000106"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:25.796220" elapsed="0.000023"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:25.742042" elapsed="0.054321">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:26.825824" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:26.825348" elapsed="0.000508"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:26.826357" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:26.826038" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:26.826432" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:20:26.826771" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:26.824937" elapsed="0.001859"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:26.831378" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:26.831187" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:26.831789" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.831550" elapsed="0.000545">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.832275" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.832482" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.832638" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.832796" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.833008" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.833172" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.833352" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.833560" elapsed="0.000028"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.846646" elapsed="0.000039"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.846912" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.857002" 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-07T17:20:26.857200" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.857338" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.830637" elapsed="0.026831">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:26.857584" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:26.857628" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:26.830076" elapsed="0.027575"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.857866" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:26.857743" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:26.857722" 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-07T17:20:26.859280" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:26.859953" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:26.859641" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:26.860779" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:26.860512" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:26.860850" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:26.861039" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:26.860179" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:26.861591" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:26.861222" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:26.862127" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:26.861769" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:26.862537" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:26.872268" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:26.862308" elapsed="0.011778">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.874267" 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-07T17:20:26.874433" 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-07T17:20:26.874593" 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-07T17:20:26.874753" 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-07T17:20:26.874917" 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-07T17:20:26.875092" 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-07T17:20:26.875365" 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-07T17:20:26.875531" 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-07T17:20:26.875688" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:26.875241" elapsed="0.000499"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.875165" 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-07T17:20:26.875902" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.875960" elapsed="0.000029"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.858721" elapsed="0.017399">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:26.876236" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:26.876280" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:26.858099" elapsed="0.018204"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:26.876997" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.876600" elapsed="0.000470">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:26.876388" elapsed="0.000751">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:26.876369" elapsed="0.000806">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.877221" elapsed="0.000225"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.829520" elapsed="0.048016">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.877713" 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-07T17:20:26.877876" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.877937" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:26.827126" elapsed="0.050930">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:26.878219" 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-07T17:20:26.878392" 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-07T17:20:26.878557" 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-07T17:20:26.878714" 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-07T17:20:26.878874" 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-07T17:20:26.879046" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:26.879109" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:26.824178" elapsed="0.055029">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:27.910056" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:27.909506" elapsed="0.000583"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.910574" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:27.910258" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:27.910649" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:20:27.910826" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:27.908991" elapsed="0.001865"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:20:27.915574" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:20:27.915383" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:20:27.916000" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.915746" elapsed="0.000331">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.916369" elapsed="0.000026"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.916581" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.916736" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.916892" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.917088" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.917249" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.917421" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.917583" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.927671" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.927865" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.937908" 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-07T17:20:27.938121" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.938188" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.914834" elapsed="0.023472">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:20:27.938425" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:27.938468" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.914275" elapsed="0.024216"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.938737" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:27.938585" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:27.938565" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:20:27.940131" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.940798" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:20:27.940490" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:27.941612" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:27.941352" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:27.941684" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:20:27.941854" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:27.941021" elapsed="0.000857"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.942419" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:27.942050" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.942951" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:20:27.942609" elapsed="0.000387"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:20:27.943388" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']"
        }
    }
    </msg>
<msg time="2026-04-07T17:20:27.954293" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:20:27.943156" elapsed="0.014964">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.958550" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.958925" elapsed="0.000075"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.959316" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.959669" 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-07T17:20:27.960069" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.960421" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.961029" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.961402" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.961790" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:20:27.960725" elapsed="0.001186"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.960571" elapsed="0.001426"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.962303" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.962431" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.939577" elapsed="0.023008">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:20:27.962700" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:27.962744" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.938957" elapsed="0.023810"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.963435" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.963120" elapsed="0.000374">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:27.962892" elapsed="0.000663">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</branch>
<status status="FAIL" start="2026-04-07T17:20:27.962874" elapsed="0.000713">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.963632" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.913626" elapsed="0.050103">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.963899" 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-07T17:20:27.964074" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.964136" 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 ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:20:27.911243" elapsed="0.052996">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:27.964399" 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-07T17:20:27.964576" 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-07T17:20:27.964737" 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-07T17:20:27.964893" 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-07T17:20:27.965066" 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-07T17:20:27.965223" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.965281" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:20:27.908216" elapsed="0.057160">Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<msg time="2026-04-07T17:20:27.965475" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.246340" elapsed="20.719225">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.965639" elapsed="0.000015"/>
</return>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:20:07.244282" elapsed="20.721471">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</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-07T17:20:27.966050" elapsed="0.000027"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:20:06.913781" elapsed="21.052446">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c</status>
</test>
<test id="s1-s2-s1-t30" name="Create Bridge Manually and Verify After Recover" line="150">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:27.970555" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:27.970290" elapsed="0.000525"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.971809" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:27.971700" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:27.971682" 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-07T17:20:27.976377" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:27.976270" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:27.976252" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.977427" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:27.977051" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:27.977990" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:27.977640" elapsed="0.000377"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:27.978061" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:27.978214" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:27.976660" elapsed="0.001578"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.983277" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:27.983170" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:27.983151" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:27.984571" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:27.984466" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:27.984448" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:27.985151" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:27.984775" elapsed="0.000403"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:27.985597" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:27.985331" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.011278" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:27.986241" elapsed="0.025197"/>
</kw>
<msg time="2026-04-07T17:20:28.011614" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:28.011660" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.985805" elapsed="0.025890"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.066745" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:28.012272" elapsed="0.054669"/>
</kw>
<msg time="2026-04-07T17:20:28.067130" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:28.067175" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.011862" elapsed="0.055350"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.067508" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.067289" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.067269" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.068182" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.067788" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.068552" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.068336" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.068318" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:28.068685" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.071017" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.072442" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:28.073893" elapsed="0.000382"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.069537" elapsed="0.004809"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:28.068945" elapsed="0.005514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:27.984165" elapsed="0.090393"/>
</kw>
<msg time="2026-04-07T17:20:28.074648" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.074691" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.983492" elapsed="0.091236"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:28.074909" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.074803" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.074784" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.075401" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.075726" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.075796" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:27.982822" elapsed="0.093079"/>
</kw>
<msg time="2026-04-07T17:20:28.076006" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.076050" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.978592" elapsed="0.097493"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.076400" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.076160" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.076143" elapsed="0.000332"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:27.978459" elapsed="0.098039"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.081786" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:28.081679" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.081660" elapsed="0.000234"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.083128" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:28.083020" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.083002" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:28.083681" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.083332" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.084161" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:28.083857" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.111782" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:28.084717" elapsed="0.027487"/>
</kw>
<msg time="2026-04-07T17:20:28.112587" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:28.112743" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.084341" elapsed="0.028487"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.173241" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:28.114177" elapsed="0.059264"/>
</kw>
<msg time="2026-04-07T17:20:28.173612" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:28.173658" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.113230" elapsed="0.060466"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.174034" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.173775" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.173755" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.174653" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.174277" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.175209" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.174806" elapsed="0.000481"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.174789" elapsed="0.000524"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:28.175345" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.177642" elapsed="0.000551"/>
</kw>
<kw name="Open 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-07T17:20:28.179124" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:28.180538" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.176191" elapsed="0.004734"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:28.175597" elapsed="0.005458"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:28.082706" elapsed="0.098449"/>
</kw>
<msg time="2026-04-07T17:20:28.181245" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.181289" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.082090" elapsed="0.099236"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:28.181507" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.181402" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.181383" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.182008" elapsed="0.000029"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.182341" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.182410" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:28.081342" elapsed="0.101217"/>
</kw>
<msg time="2026-04-07T17:20:28.182651" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.182694" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.076751" elapsed="0.105979"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.183062" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.182804" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.182787" elapsed="0.000353"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:28.076617" elapsed="0.106545"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.188386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:28.188278" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.188259" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.189632" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:28.189527" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.189510" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:28.190229" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.189836" elapsed="0.000420"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.190654" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:28.190408" elapsed="0.000272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.221380" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:28.191233" elapsed="0.030324"/>
</kw>
<msg time="2026-04-07T17:20:28.221726" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:28.221772" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.190832" elapsed="0.030976"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.283837" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:28.222407" elapsed="0.061642"/>
</kw>
<msg time="2026-04-07T17:20:28.284218" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:28.284264" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.222017" elapsed="0.062283"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.284594" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.284376" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.284357" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.285219" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "l "l "y "[C "[78Ca "[A[78Cn
 "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.284831" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.285585" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.285369" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.285351" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:28.285715" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.290164" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:20:28.291611" elapsed="0.000527"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:28.293046" elapsed="0.000312"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.286569" elapsed="0.006859"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:28.285991" elapsed="0.007549"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:28.189228" elapsed="0.104410"/>
</kw>
<msg time="2026-04-07T17:20:28.293728" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.293771" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.188605" elapsed="0.105202"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:28.294039" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.293884" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.293865" elapsed="0.000264"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.294516" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.294837" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.294907" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:28.187726" elapsed="0.107303"/>
</kw>
<msg time="2026-04-07T17:20:28.295121" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:28.295164" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:28.183412" elapsed="0.111788"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.295516" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.295272" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.295256" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:28.183279" elapsed="0.112341"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:27.978288" elapsed="0.317360"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:27.975896" elapsed="0.319805"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:27.971389" elapsed="0.324364"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:27.970957" elapsed="0.324838"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:27.967794" elapsed="0.328051"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:20:28.303850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.303589" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.303571" elapsed="0.000360"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.304239" 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-07T17:20:28.304341" 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-07T17:20:28.304089" elapsed="0.000278"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.304895" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:20:28.304515" elapsed="0.000425"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.305474" level="INFO">${conn_id} = 523</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-07T17:20:28.305106" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.306474" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:28.306555" 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-07T17:20:28.306188" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.306732" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.307900" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:28.656533" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:01 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:28.307585" elapsed="0.349097"/>
</kw>
<msg time="2026-04-07T17:20:28.656763" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.307227" elapsed="0.349612"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:28.305744" elapsed="0.351198"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:28.657421" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:20:28.720542" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:28.720796" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:28.720893" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:28.657182" elapsed="0.063762"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:28.721368" elapsed="0.000488"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.723073" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.722403" elapsed="0.000768"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.723619" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:28.723341" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.723293" elapsed="0.000482"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:28.724157" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.723889" elapsed="0.000400"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.723856" elapsed="0.000486"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.724416" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.730354" elapsed="0.000424"/>
</kw>
<kw name="Open 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-07T17:20:28.730942" elapsed="0.000171"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:28.731257" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.725127" elapsed="0.006278"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:28.302928" elapsed="0.428569"/>
</kw>
<msg time="2026-04-07T17:20:28.731554" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.302380" elapsed="0.429223"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:28.301837" elapsed="0.429849"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.732221" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.731867" elapsed="0.000380"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.732709" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.732419" elapsed="0.000315"/>
</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-07T17:20:28.742518" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:28.742091" elapsed="0.000455"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.743030" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:28.742707" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:28.743100" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:28.743252" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:28.741706" elapsed="0.001571"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.748592" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.748295" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.748663" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:28.748807" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.747938" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.755256" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.755004" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.755695" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.755450" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:28.764232" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:28.764387" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:28.764517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.757711" elapsed="0.006846"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.755805" elapsed="0.008810"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.764862" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.764652" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.755786" elapsed="0.009217"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.769784" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.766547" elapsed="0.003545"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.766166" elapsed="0.003977"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.766141" elapsed="0.004038"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.773654" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.770627" elapsed="0.003089"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.770260" elapsed="0.003503"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.770237" elapsed="0.003560"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.774683" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.774045" elapsed="0.000676"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.775170" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.774820" elapsed="0.000431"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.775880" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.775509" elapsed="0.000397"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.775285" elapsed="0.000657"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.774794" elapsed="0.001170"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.776506" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.776142" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.776871" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.776640" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.777423" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.777127" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.776952" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.776620" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.777654" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:28.778524" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.778175" elapsed="0.000379"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.778716" elapsed="0.002119"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:28.765510" elapsed="0.015388"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:28.781089" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.780981" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.780949" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.781316" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.781386" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:28.783577" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.749176" elapsed="0.034429"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:28.783655" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:28.783802" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:28.747452" elapsed="0.036375"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.785010" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:28.784614" elapsed="0.000466"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:28.784458" elapsed="0.000662"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:28.784329" elapsed="0.000822"/>
</for>
<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="PASS" start="2026-04-07T17:20:28.784066" elapsed="0.001138"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:28.743483" elapsed="0.041755"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.790639" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.790336" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.790711" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:28.790855" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.789965" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.797047" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.796786" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.797479" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.797241" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:28.810832" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:28.810933" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:28.811049" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.799586" elapsed="0.011525"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.797588" elapsed="0.013567"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.811331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.811181" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.797570" elapsed="0.013846"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.818867" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.813616" elapsed="0.005390"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.813111" elapsed="0.005980"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.813068" elapsed="0.006081"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.824567" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.819766" elapsed="0.004902"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.819275" elapsed="0.005469"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.819237" elapsed="0.005563"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.826027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.825176" elapsed="0.000914"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.826821" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.826249" elapsed="0.000700"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.827889" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.827382" elapsed="0.000543"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.827035" elapsed="0.000959"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.826207" elapsed="0.001819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.828796" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.828240" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.829272" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.828930" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.830028" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.829598" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.829384" elapsed="0.000732"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.828904" elapsed="0.001241"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.830358" elapsed="0.000478"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:28.831463" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.831084" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.831763" elapsed="0.003251"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:28.812131" elapsed="0.022972"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:28.835347" elapsed="0.000036"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.835200" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.835174" elapsed="0.000290"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.835682" elapsed="0.000026"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.835759" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:28.837889" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.791211" elapsed="0.046706"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:28.837980" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:28.838131" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:28.789479" elapsed="0.048677"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.839369" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:28.838998" elapsed="0.000435"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:28.838837" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:28.838706" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:20:28.838437" elapsed="0.001117"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:28.785323" elapsed="0.054264"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.844788" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.844487" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.844860" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:28.845022" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.844147" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.851339" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.851090" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.851773" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.851535" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:28.862242" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:28.862343" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:28.862467" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.853783" elapsed="0.008710"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.851884" elapsed="0.010651"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.862710" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.862561" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.851865" elapsed="0.010929"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.869595" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.864212" elapsed="0.005487"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.863689" elapsed="0.006087"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.863645" elapsed="0.006187"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.873273" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.870520" elapsed="0.002798"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.869956" elapsed="0.003397"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.869918" elapsed="0.003460"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.873900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.873532" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.874241" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.874012" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.874788" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.874488" elapsed="0.000331"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.874322" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.873993" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.875409" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.875046" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.875736" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.875503" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.876284" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.875984" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.875816" elapsed="0.000569"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.875485" elapsed="0.000922"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.876551" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:28.877345" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.877072" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.877519" elapsed="0.002142"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:28.863169" elapsed="0.016555"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:28.879898" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.879794" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.879775" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.880142" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.880211" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:28.882337" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.845367" elapsed="0.037024"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:28.882453" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:28.882605" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:28.843647" elapsed="0.038983"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.883769" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:28.883404" elapsed="0.000428"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:28.883257" elapsed="0.000614"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:28.883128" elapsed="0.000772"/>
</for>
<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="PASS" start="2026-04-07T17:20:28.882850" elapsed="0.001101"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:28.839674" elapsed="0.044326"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:28.743336" elapsed="0.140693"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:28.741140" elapsed="0.142939"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:20:28.732983" elapsed="0.151147"/>
</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-07T17:20:28.893685" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:28.893309" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.894184" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:28.893866" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:28.894254" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:28.894428" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:28.892927" elapsed="0.001527"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.899792" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.899495" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.899862" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:28.900024" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.899155" elapsed="0.000935"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.906827" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.906577" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.907289" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.907043" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:28.915358" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:28.917052" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:28.917164" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.909309" elapsed="0.007881"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.907401" elapsed="0.009832"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.917409" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.917259" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.907382" elapsed="0.010112"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.921360" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.918516" elapsed="0.002931"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.918271" elapsed="0.003223"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.918254" elapsed="0.003275"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.925036" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.921955" elapsed="0.003144"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.921650" elapsed="0.003497"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.921624" elapsed="0.003558"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.925909" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.925397" elapsed="0.000549"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.926387" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.926067" elapsed="0.000440"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.927199" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.926757" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.926540" elapsed="0.000744"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.926041" elapsed="0.001273"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.927947" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.927541" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.928286" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.928059" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.928846" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.928518" elapsed="0.000353"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.928365" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.928040" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.929085" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:28.929858" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.929588" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.930047" elapsed="0.002164"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:28.917838" elapsed="0.014435"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:28.932448" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.932343" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.932325" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.932679" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.932748" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:28.934948" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.900418" elapsed="0.034572"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:28.935042" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:28.935191" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:28.898648" elapsed="0.036568"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.936359" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:28.935990" elapsed="0.000444"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:28.935830" elapsed="0.000644"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:28.935702" elapsed="0.000804"/>
</for>
<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="PASS" start="2026-04-07T17:20:28.935435" elapsed="0.001134"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:28.894637" elapsed="0.041975"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.942023" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.941665" elapsed="0.000385"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.942095" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:28.942242" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.941323" elapsed="0.000944"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.948387" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.948141" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.948819" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.948580" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:28.961865" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:28.963978" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:28.964138" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.950832" elapsed="0.013341"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.948929" elapsed="0.015302"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.964475" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.964268" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.948910" elapsed="0.015682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.969237" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.965988" elapsed="0.003380"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.965666" elapsed="0.003751"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.965641" elapsed="0.003811"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.972776" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.969831" elapsed="0.003008"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.969528" elapsed="0.003358"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.969505" elapsed="0.003416"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.973671" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.973157" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.974142" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.973803" elapsed="0.000420"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.974893" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.974481" elapsed="0.000447"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.974256" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.973779" elapsed="0.001251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.975739" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.975243" elapsed="0.000532"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.976207" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:28.975870" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.976934" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.976532" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.976320" elapsed="0.000719"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.975845" elapsed="0.001224"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:28.977267" elapsed="0.000473"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:28.978357" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:28.977960" elapsed="0.000467"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:28.978650" elapsed="0.002575"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:28.965088" elapsed="0.016200"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:28.981459" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:28.981356" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.981338" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:28.981682" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:28.981751" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:28.983942" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.942596" elapsed="0.041388"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:28.984036" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:28.984186" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:28.940821" elapsed="0.043390"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.985351" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:28.984965" elapsed="0.000461"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:28.984819" elapsed="0.000646"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:28.984690" elapsed="0.000805"/>
</for>
<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="PASS" start="2026-04-07T17:20:28.984430" elapsed="0.001116"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:28.936719" elapsed="0.048896"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.990804" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:28.990505" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:28.990877" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:28.991046" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:28.990135" elapsed="0.000936"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.997166" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.996904" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:28.997597" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:28.997358" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:29.010785" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:29.010964" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:29.011095" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:28.999610" elapsed="0.011511"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:28.997705" elapsed="0.013458"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.011338" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.011189" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:28.997687" elapsed="0.013736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.019067" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.013560" elapsed="0.005716"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.013073" elapsed="0.006283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.013031" elapsed="0.006382"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.024195" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.020063" elapsed="0.004177"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.019539" elapsed="0.004736"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.019501" elapsed="0.004799"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.024823" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.024457" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.025176" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.024921" elapsed="0.000313"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.025707" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.025410" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.025258" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.024902" elapsed="0.000887"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.026319" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.025941" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.026667" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.026437" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.027214" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.026901" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.026751" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.026417" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.027436" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:29.028220" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.027936" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.028394" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:29.012114" elapsed="0.018460"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:29.030746" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.030643" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.030625" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.030983" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.031054" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:29.033235" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:28.991389" elapsed="0.041874"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:29.033313" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:29.033459" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:28.989632" elapsed="0.043853"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.034662" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:29.034264" elapsed="0.000476"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:29.034116" elapsed="0.000663"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:29.033984" elapsed="0.000825"/>
</for>
<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="PASS" start="2026-04-07T17:20:29.033707" elapsed="0.001153"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:28.985706" elapsed="0.049221"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:28.894505" elapsed="0.140453"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:28.892370" elapsed="0.142658"/>
</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_operational}</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-07T17:20:28.884317" elapsed="0.150763"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:20:28.299803" elapsed="0.735341"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:20:27.966866" elapsed="1.068401"/>
</test>
<test id="s1-s2-s1-t31" name="Add Port Manually and Verify After Recover" line="154">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:29.038894" elapsed="0.000300"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:29.038636" elapsed="0.000613"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.040225" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.040117" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.040098" 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-07T17:20:29.044965" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.044858" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.044840" elapsed="0.000207"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.046026" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:29.045632" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.046533" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:29.046209" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:29.046603" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.046754" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.045264" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.051790" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.051683" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.051664" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.053100" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.052990" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.052949" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:29.053659" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.053306" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.054112" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:29.053837" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.083201" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:29.054692" elapsed="0.028880"/>
</kw>
<msg time="2026-04-07T17:20:29.083853" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:29.083917" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.054291" elapsed="0.029696"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.150742" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:29.084771" elapsed="0.066181"/>
</kw>
<msg time="2026-04-07T17:20:29.151151" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:29.151239" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.084224" elapsed="0.067055"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.151585" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.151360" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.151338" elapsed="0.000351"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.152234" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.151827" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.152596" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.152385" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.152367" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:29.152729" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.155088" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:20:29.156530" elapsed="0.000646"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:29.158090" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.153602" elapsed="0.004895"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:29.153005" elapsed="0.005605"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:29.052668" elapsed="0.106041"/>
</kw>
<msg time="2026-04-07T17:20:29.158800" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.158847" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.052018" elapsed="0.106866"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:29.159087" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.158962" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.158943" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.159561" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.159887" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.159958" elapsed="0.000041"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:29.051349" elapsed="0.108745"/>
</kw>
<msg time="2026-04-07T17:20:29.160184" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.160227" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.047147" elapsed="0.113116"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.160580" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.160337" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.160319" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:29.047007" elapsed="0.113672"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.165944" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.165837" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.165817" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.167245" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.167136" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.167118" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:29.167846" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.167493" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.168294" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:29.168043" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.198097" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:29.168851" elapsed="0.029661"/>
</kw>
<msg time="2026-04-07T17:20:29.198897" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:29.199035" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.168473" elapsed="0.030648"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.256693" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:29.200015" elapsed="0.057073"/>
</kw>
<msg time="2026-04-07T17:20:29.257364" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:29.257429" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.199503" elapsed="0.057977"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.257945" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.257603" elapsed="0.000476"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.257565" elapsed="0.000550"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.258945" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.258362" elapsed="0.000691"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.259351" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.259122" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.259103" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:29.259489" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.261868" elapsed="0.000569"/>
</kw>
<kw name="Open 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-07T17:20:29.263380" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:29.264785" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.260375" elapsed="0.004821"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:29.259760" elapsed="0.005550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:29.166801" elapsed="0.098609"/>
</kw>
<msg time="2026-04-07T17:20:29.265501" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.265545" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.166174" elapsed="0.099407"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:29.265764" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.265658" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.265639" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.266246" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.268626" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.268703" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:29.165498" elapsed="0.103332"/>
</kw>
<msg time="2026-04-07T17:20:29.268925" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.268992" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.160932" elapsed="0.108101"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.269374" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.269111" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.269093" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:29.160799" elapsed="0.108679"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.274803" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.274695" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.274676" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.276124" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.276013" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.275992" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:29.276697" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.276341" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.277150" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:29.276878" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.305733" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:29.277735" elapsed="0.028174"/>
</kw>
<msg time="2026-04-07T17:20:29.306097" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:29.306143" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.277342" elapsed="0.028837"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.370912" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:29.306800" elapsed="0.064324"/>
</kw>
<msg time="2026-04-07T17:20:29.371292" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:29.371338" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.306394" elapsed="0.064981"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.371682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.371456" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.371432" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.372320" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "n "d "[C "V "[78Ce "[A[78Cr
 "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.371922" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.372681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.372472" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.372454" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:29.372812" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.375214" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:20:29.376658" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:29.378102" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.373728" elapsed="0.004766"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:29.373116" elapsed="0.005491"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:29.275685" elapsed="0.103022"/>
</kw>
<msg time="2026-04-07T17:20:29.378797" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.378840" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.275032" elapsed="0.103845"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:29.379075" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.378952" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.378934" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.379533" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.379853" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.379923" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:29.274352" elapsed="0.105705"/>
</kw>
<msg time="2026-04-07T17:20:29.380150" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:29.380192" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.269735" elapsed="0.110493"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.380545" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.380302" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.380285" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:29.269600" elapsed="0.111046"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:29.046829" elapsed="0.333845"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:29.044497" elapsed="0.336231"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:29.039817" elapsed="0.340966"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:29.039396" elapsed="0.341432"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:29.036427" elapsed="0.344452"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:20:29.389068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.388795" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.388777" elapsed="0.000372"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.389466" 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-07T17:20:29.389592" 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-07T17:20:29.389290" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.390213" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:20:29.389807" elapsed="0.000488"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.390817" level="INFO">${conn_id} = 528</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-07T17:20:29.390448" elapsed="0.000396"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.391739" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:29.391815" 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-07T17:20:29.391463" elapsed="0.000375"/>
</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-07T17:20:29.392005" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.393160" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:29.725208" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:28 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:29.392831" elapsed="0.332460"/>
</kw>
<msg time="2026-04-07T17:20:29.725349" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.392484" elapsed="0.332928"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:29.391074" elapsed="0.334424"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:29.725847" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:20:29.779074" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:29.779314" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:29.779412" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:29.725669" elapsed="0.053797"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:29.779819" elapsed="0.000492"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.781392" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.780760" elapsed="0.000736"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.781906" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:29.781650" elapsed="0.000390"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.781607" elapsed="0.000486"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:29.782441" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.782210" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.782177" elapsed="0.000444"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.782694" elapsed="0.000030"/>
</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-07T17:20:29.788861" elapsed="0.000737"/>
</kw>
<kw name="Open 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-07T17:20:29.789827" elapsed="0.000179"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:29.790181" 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-07T17:20:29.783725" elapsed="0.006607"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:29.388276" elapsed="0.402146"/>
</kw>
<msg time="2026-04-07T17:20:29.790475" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.387712" elapsed="0.402810"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:29.387216" elapsed="0.403425"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.791157" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.790818" elapsed="0.000366"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.791645" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.791356" elapsed="0.000315"/>
</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-07T17:20:29.801360" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:29.800978" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.801851" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:29.801542" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:29.801920" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.802090" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.800596" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.807371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.807072" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:29.807442" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.807587" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.806717" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.813919" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.813670" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.814373" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.814130" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:29.828794" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:29.828998" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:29.829149" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:29.816599" elapsed="0.012587"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.814483" elapsed="0.014761"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.829493" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.829281" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.814464" elapsed="0.015148"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.834241" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.831048" elapsed="0.003258"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.830727" elapsed="0.003627"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.830701" elapsed="0.003689"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.837870" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.834772" elapsed="0.003162"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.834467" elapsed="0.003532"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.834444" elapsed="0.003592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.838797" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.838257" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.839279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.838931" elapsed="0.000478"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.840188" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.839671" elapsed="0.000555"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.839448" elapsed="0.000828"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.838906" elapsed="0.001402"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.841060" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.840527" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.841518" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.841195" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.842281" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.841848" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.841630" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.841170" elapsed="0.001225"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.842596" elapsed="0.000498"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:29.843850" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.843317" elapsed="0.000599"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.844177" elapsed="0.003002"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:29.830137" elapsed="0.017128"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:29.847517" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.847370" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.847343" elapsed="0.000293"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.847920" elapsed="0.000037"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.848061" elapsed="0.000024"/>
</return>
<msg time="2026-04-07T17:20:29.850401" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:29.807939" elapsed="0.042489"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:29.850479" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:29.850631" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:29.806236" elapsed="0.044419"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.852253" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:29.851832" elapsed="0.000487"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:29.851643" elapsed="0.000716"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:29.851152" elapsed="0.001238"/>
</for>
<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="PASS" start="2026-04-07T17:20:29.850875" elapsed="0.001567"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:29.802308" elapsed="0.050167"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.857717" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.857419" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:29.857788" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.857933" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.857082" elapsed="0.000875"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.864428" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.864176" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.864865" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.864622" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:29.876875" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:29.876997" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:29.877092" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:29.866932" elapsed="0.010185"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.864989" elapsed="0.012170"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.877335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.877186" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.864956" elapsed="0.012465"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.884781" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.879718" elapsed="0.005167"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.879095" elapsed="0.005866"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.879052" elapsed="0.006000"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.888978" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.885659" elapsed="0.003366"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.885178" elapsed="0.003882"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.885141" elapsed="0.003944"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.889609" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.889239" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.889935" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.889705" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.890487" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.890190" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.890033" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.889687" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.891111" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.890723" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.891480" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.891226" elapsed="0.000312"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.892035" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.891719" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.891562" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.891205" elapsed="0.000912"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.892260" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:29.893045" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.892758" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.893220" elapsed="0.002182"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:29.878123" elapsed="0.017343"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:29.895642" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.895536" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.895517" elapsed="0.000210"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.895868" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.895937" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:29.898070" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:29.858294" elapsed="0.039840"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:29.898189" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.898339" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:29.856583" elapsed="0.041780"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.899591" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:29.899197" elapsed="0.000459"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:29.898988" elapsed="0.000708"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:29.898842" elapsed="0.000883"/>
</for>
<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="PASS" start="2026-04-07T17:20:29.898581" elapsed="0.001197"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:29.852562" elapsed="0.047250"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.905217" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.904901" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:29.905289" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.905435" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.904564" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.911723" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.911476" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.912176" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.911916" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:29.922382" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:29.922486" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:29.922591" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:29.914168" elapsed="0.008467"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.912286" elapsed="0.010445"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.923088" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.922790" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.912268" elapsed="0.010946"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.927763" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.924599" elapsed="0.003235"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.924292" elapsed="0.003589"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.924267" elapsed="0.003649"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.931357" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.928317" elapsed="0.003102"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.928014" elapsed="0.003452"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.927988" elapsed="0.003512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.932127" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.931731" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.932452" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.932225" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.933004" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.932691" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.932533" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.932206" elapsed="0.000919"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.933656" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.933285" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.933998" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.933753" elapsed="0.000303"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.934527" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.934234" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.934080" elapsed="0.000526"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.933734" elapsed="0.000901"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.934815" elapsed="0.000368"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:29.935618" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.935343" elapsed="0.000300"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.935791" elapsed="0.002262"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:29.923688" elapsed="0.014428"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:29.938290" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.938185" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.938166" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.938529" elapsed="0.000027"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.938618" elapsed="0.000018"/>
</return>
<msg time="2026-04-07T17:20:29.940759" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:29.905784" elapsed="0.035002"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:29.940837" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.940999" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:29.904077" elapsed="0.036948"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.942164" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:29.941782" elapsed="0.000446"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:29.941636" elapsed="0.000631"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:29.941503" elapsed="0.000793"/>
</for>
<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="PASS" start="2026-04-07T17:20:29.941244" elapsed="0.001103"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:29.899900" elapsed="0.042480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:29.802170" elapsed="0.140237"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.800012" elapsed="0.142467"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:20:29.791843" elapsed="0.150704"/>
</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-07T17:20:29.952283" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:29.951889" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.952765" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:29.952463" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:29.952834" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:29.952999" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.951489" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.958706" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.958406" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:29.958778" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:29.958925" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:29.958053" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.965342" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.965094" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.965778" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.965536" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:29.974836" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:29.975932" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:29.976060" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:29.968060" elapsed="0.008026"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.965888" elapsed="0.010240"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.976303" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.976154" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.965869" elapsed="0.010518"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.980283" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.977380" elapsed="0.003044"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.977163" elapsed="0.003312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.977145" elapsed="0.003364"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.983868" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:29.980894" elapsed="0.003037"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.980587" elapsed="0.003409"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.980563" elapsed="0.003469"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.984764" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.984249" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.985242" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.984898" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.986048" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.985567" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.985356" elapsed="0.000796"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.984873" elapsed="0.001315"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.986937" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.986424" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.987414" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:29.987096" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.988170" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:29.987739" elapsed="0.000467"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:29.987526" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.987071" elapsed="0.001214"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:29.988486" elapsed="0.000474"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:29.989580" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:29.989204" elapsed="0.000412"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:29.989822" elapsed="0.002478"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:29.976724" elapsed="0.015639"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:29.992536" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:29.992432" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:29.992414" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:29.992768" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:29.992837" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:29.995150" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:29.959289" elapsed="0.035889"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:29.995229" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:29.995378" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:29.957551" elapsed="0.037852"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:29.996552" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:29.996180" elapsed="0.000449"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:29.996031" elapsed="0.000637"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:29.995885" elapsed="0.000813"/>
</for>
<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="PASS" start="2026-04-07T17:20:29.995627" elapsed="0.001122"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:29.953257" elapsed="0.043560"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.002287" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.001956" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:30.002360" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:30.002507" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.001553" elapsed="0.000978"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.008599" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.008351" elapsed="0.000294"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.009051" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.008794" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:30.021297" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:30.022127" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:30.022379" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:30.011169" elapsed="0.011268"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.009163" elapsed="0.013369"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.022920" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.022590" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.009144" elapsed="0.014003"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.030589" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.025369" elapsed="0.005397"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.024854" elapsed="0.005955"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.024813" elapsed="0.006021"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.033222" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.031125" elapsed="0.002142"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.030890" elapsed="0.002412"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.030873" elapsed="0.002463"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.033868" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.033491" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.034211" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.033980" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.034737" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.034444" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.034292" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.033946" elapsed="0.000872"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.035342" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.034982" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.035665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.035437" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.036210" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.035897" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.035746" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.035419" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.036436" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:30.037222" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.036937" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:30.037419" elapsed="0.002246"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:30.023894" elapsed="0.015833"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:30.039899" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.039795" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.039777" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.040141" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.040212" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:30.042452" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:30.002847" elapsed="0.039633"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:30.042531" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:30.042680" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:30.001071" elapsed="0.041635"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.043853" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:30.043484" elapsed="0.000446"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:30.043338" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:30.043209" elapsed="0.000807"/>
</for>
<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="PASS" start="2026-04-07T17:20:30.042926" elapsed="0.001144"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:29.996908" elapsed="0.047230"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.049314" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.048998" elapsed="0.000342"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:30.049388" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:30.049534" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.048645" elapsed="0.000913"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.055714" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.055463" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.056165" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.055905" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:30.069259" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:30.069531" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:30.069684" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:30.058271" elapsed="0.011449"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.056275" elapsed="0.013503"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.070043" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.069814" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.056256" elapsed="0.013907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.075060" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.071540" elapsed="0.003652"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.071238" elapsed="0.004004"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.071212" elapsed="0.004066"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.078709" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.075663" elapsed="0.003110"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.075356" elapsed="0.003464"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.075332" elapsed="0.003523"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.079608" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.079092" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.080088" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.079743" elapsed="0.000427"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.080871" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.080420" elapsed="0.000493"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.080204" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.079718" elapsed="0.001321"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.081767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.081258" elapsed="0.000550"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.082243" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.081905" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.082990" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:30.082566" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:30.082355" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.081880" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.083309" elapsed="0.000471"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:30.084395" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:30.084020" elapsed="0.000411"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:30.084635" elapsed="0.002963"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:30.070632" elapsed="0.017052"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:30.087923" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.087778" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.087753" elapsed="0.000310"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.088259" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.088356" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:20:30.091074" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:30.049879" elapsed="0.041223"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:30.091152" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:30.091300" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:30.048165" elapsed="0.043161"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.092474" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:30.092104" elapsed="0.000446"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:20:30.091942" elapsed="0.000665"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:30.091812" elapsed="0.000834"/>
</for>
<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="PASS" start="2026-04-07T17:20:30.091546" elapsed="0.001161"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:30.044231" elapsed="0.048551"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:29.953121" elapsed="0.139699"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.950893" elapsed="0.141988"/>
</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_operational}</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-07T17:20:29.942781" elapsed="0.150153"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:20:29.385184" elapsed="0.707835"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:20:29.035773" elapsed="1.057374"/>
</test>
<test id="s1-s2-s1-t32" name="Create Tap Device After Recover" line="158">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:30.096324" elapsed="0.000217"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:30.096070" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.097634" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.097526" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.097507" 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-07T17:20:30.102455" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.102341" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.102323" elapsed="0.000201"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.103505" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:30.103130" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.104002" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:30.103685" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:30.104073" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:30.104226" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:30.102745" elapsed="0.001505"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.109271" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.109163" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.109144" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.110556" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.110448" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.110430" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:30.111159" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:30.110789" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.111592" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:30.111338" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.142496" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:30.112158" elapsed="0.030536"/>
</kw>
<msg time="2026-04-07T17:20:30.142900" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:30.142947" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.111770" elapsed="0.031296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.188844" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:30.143683" elapsed="0.045370"/>
</kw>
<msg time="2026-04-07T17:20:30.189220" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:30.189317" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.143246" elapsed="0.046111"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.189666" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.189436" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.189416" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.190310" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.189906" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.190675" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.190459" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.190441" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:30.190805" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.193123" elapsed="0.000509"/>
</kw>
<kw name="Open 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-07T17:20:30.194553" elapsed="0.002041"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:30.197506" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.191677" elapsed="0.006226"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:30.191083" elapsed="0.006963"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:30.110147" elapsed="0.087999"/>
</kw>
<msg time="2026-04-07T17:20:30.198236" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.198279" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.109483" elapsed="0.088833"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:30.198498" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.198392" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.198373" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.198963" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.199319" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.199392" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:30.108817" elapsed="0.090683"/>
</kw>
<msg time="2026-04-07T17:20:30.199590" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.199632" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.104633" elapsed="0.095036"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.199997" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.199741" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.199724" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:30.104494" elapsed="0.095603"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.205215" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.205109" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.205090" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.206553" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.206447" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.206429" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:30.207200" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:30.206794" elapsed="0.000439"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.207679" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:30.207417" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.240284" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:30.208257" elapsed="0.032214"/>
</kw>
<msg time="2026-04-07T17:20:30.240643" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:30.240688" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.207860" elapsed="0.032865"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.297330" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:30.241302" elapsed="0.056229"/>
</kw>
<msg time="2026-04-07T17:20:30.297705" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:30.297750" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.240895" elapsed="0.056893"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.298152" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.297867" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.297846" elapsed="0.000434"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.298841" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.298421" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.299220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.299008" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.298989" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:30.299351" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.301631" elapsed="0.000589"/>
</kw>
<kw name="Open 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-07T17:20:30.303157" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:30.304541" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.300193" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:30.299601" elapsed="0.005459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:30.206148" elapsed="0.099013"/>
</kw>
<msg time="2026-04-07T17:20:30.305252" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.305295" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.205430" elapsed="0.099902"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:30.305515" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.305409" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.305391" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.306039" elapsed="0.000033"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.306639" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.306714" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:30.204760" elapsed="0.102070"/>
</kw>
<msg time="2026-04-07T17:20:30.306924" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.306987" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.200349" elapsed="0.106677"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.307348" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.307102" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.307085" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:30.200214" elapsed="0.107235"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.312583" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.312477" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.312458" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.313857" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.313721" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.313703" elapsed="0.000237"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:30.314476" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:30.314123" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.314904" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:30.314654" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.343444" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:30.315480" elapsed="0.028156"/>
</kw>
<msg time="2026-04-07T17:20:30.343826" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:30.343872" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.315099" elapsed="0.028811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.392285" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:30.344555" elapsed="0.047964"/>
</kw>
<msg time="2026-04-07T17:20:30.392706" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:30.392752" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.344124" elapsed="0.048665"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.393213" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.392891" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.392863" elapsed="0.000459"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.393850" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "T "a "p "[C "D "e "v "i "c "e "[C "A "f "t "e "r "[78C[C "[A[78CR
 "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.393467" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.394243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.394028" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.394008" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:30.394382" elapsed="0.000036"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.396945" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:20:30.398506" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:30.399942" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.395383" elapsed="0.004980"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:30.394678" elapsed="0.005801"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:30.313423" elapsed="0.087159"/>
</kw>
<msg time="2026-04-07T17:20:30.400679" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.400724" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.312796" elapsed="0.087965"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:30.400997" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.400841" elapsed="0.000220"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.400821" elapsed="0.000265"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.401600" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.402005" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.402083" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:30.312140" elapsed="0.090055"/>
</kw>
<msg time="2026-04-07T17:20:30.402291" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:30.402335" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.307735" elapsed="0.094639"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:30.402701" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.402451" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.402434" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:30.307568" elapsed="0.095234"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:30.104300" elapsed="0.298536"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:30.101979" elapsed="0.300920"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:30.097242" elapsed="0.305744"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:30.096790" elapsed="0.306250"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:30.094123" elapsed="0.308975"/>
</kw>
<kw name="Create Sample Tap Device" owner="ClusterOvsdb">
<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-07T17:20:30.405853" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.405590" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.405571" elapsed="0.000366"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.406278" 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-07T17:20:30.406382" 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-07T17:20:30.406133" elapsed="0.000275"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.406947" level="INFO">Attempting to execute command "ip tuntap add mode tap vport1" on remote system "10.30.171.56" 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-07T17:20:30.406558" elapsed="0.000491"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.407628" level="INFO">${conn_id} = 533</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-07T17:20:30.407241" elapsed="0.000413"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.408702" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:30.408829" 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-07T17:20:30.408408" elapsed="0.000456"/>
</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-07T17:20:30.409054" elapsed="0.000328"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.410321" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:30.742276" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:29 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:30.409900" elapsed="0.332502"/>
</kw>
<msg time="2026-04-07T17:20:30.742473" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.409549" elapsed="0.332995"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:30.407866" elapsed="0.334769"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.743058" level="INFO">Executing command 'ip tuntap add mode tap vport1'.</msg>
<msg time="2026-04-07T17:20:30.755427" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:20:30.755580" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:30.755646" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:30.742837" elapsed="0.012841"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:30.755904" elapsed="0.000338"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.756864" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:30.756495" elapsed="0.000490"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.757271" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:30.757097" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.757066" elapsed="0.000301"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:30.757589" elapsed="0.000063"/>
</return>
<status status="PASS" start="2026-04-07T17:20:30.757443" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.757421" elapsed="0.000366"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:30.757867" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.764234" elapsed="0.000763"/>
</kw>
<kw name="Open 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-07T17:20:30.765357" elapsed="0.000330"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:30.766034" elapsed="0.000219"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:30.758615" elapsed="0.007754"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:30.405054" elapsed="0.361515"/>
</kw>
<msg time="2026-04-07T17:20:30.766685" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.404221" elapsed="0.362568"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:30.403690" elapsed="0.363272"/>
</kw>
<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-07T17:20:30.770614" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:30.770291" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:30.770271" elapsed="0.000430"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.770994" 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-07T17:20:30.771097" 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-07T17:20:30.770843" elapsed="0.000280"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.771653" level="INFO">Attempting to execute command "ip tuntap add mode tap vport2" on remote system "10.30.171.56" 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-07T17:20:30.771272" elapsed="0.000428"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.772229" level="INFO">${conn_id} = 535</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-07T17:20:30.771853" elapsed="0.000402"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:30.773166" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:30.773242" 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-07T17:20:30.772867" elapsed="0.000398"/>
</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-07T17:20:30.773419" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:30.774580" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:31.106098" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:30 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:30.774265" elapsed="0.331935"/>
</kw>
<msg time="2026-04-07T17:20:31.106260" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.773897" elapsed="0.332421"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:30.772466" elapsed="0.333943"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.106773" level="INFO">Executing command 'ip tuntap add mode tap vport2'.</msg>
<msg time="2026-04-07T17:20:31.119397" level="INFO">Command exited with return code 1.</msg>
<msg time="2026-04-07T17:20:31.119555" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:31.119616" level="INFO">${stderr} = ioctl(TUNSETIFF): Operation not permitted</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:31.106592" elapsed="0.013056"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.119873" elapsed="0.000598"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.121133" level="INFO">ioctl(TUNSETIFF): Operation not permitted</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:31.120709" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.121460" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.121295" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.121266" elapsed="0.000289"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:31.121771" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-07T17:20:31.121627" elapsed="0.000224"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.121607" elapsed="0.000277"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.121930" elapsed="0.000020"/>
</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-07T17:20:31.125565" elapsed="0.000456"/>
</kw>
<kw name="Open 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-07T17:20:31.126244" elapsed="0.000204"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.126650" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:31.122367" elapsed="0.004491"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:30.769747" elapsed="0.357321"/>
</kw>
<msg time="2026-04-07T17:20:31.127145" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:30.768582" elapsed="0.358630"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ip tuntap add mode tap vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:30.767418" elapsed="0.359901"/>
</kw>
<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-07T17:20:31.130354" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:31.129958" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.129931" elapsed="0.000535"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.130850" 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-07T17:20:31.131010" 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-07T17:20:31.130670" elapsed="0.000378"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.131785" level="INFO">Attempting to execute command "ifconfig vport1 up" on remote system "10.30.171.56" 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-07T17:20:31.131254" elapsed="0.000594"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.132577" level="INFO">${conn_id} = 537</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-07T17:20:31.132078" elapsed="0.000534"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.133867" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:31.133991" 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-07T17:20:31.133496" elapsed="0.000530"/>
</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-07T17:20:31.134239" elapsed="0.000537"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.135961" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:31.447800" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:31 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:31.135529" elapsed="0.312362"/>
</kw>
<msg time="2026-04-07T17:20:31.447956" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:31.135033" elapsed="0.312999"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:31.132917" elapsed="0.315209"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.448479" level="INFO">Executing command 'ifconfig vport1 up'.</msg>
<msg time="2026-04-07T17:20:31.460840" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:20:31.460949" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:31.461011" level="INFO">${stderr} = vport1: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:31.448304" elapsed="0.012732"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.461202" elapsed="0.000244"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.462014" level="INFO">vport1: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:31.461618" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.462351" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.462181" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.462151" elapsed="0.000364"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:31.462743" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:20:31.462593" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.462570" elapsed="0.000290"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.462907" elapsed="0.000020"/>
</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-07T17:20:31.466585" elapsed="0.000454"/>
</kw>
<kw name="Open 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-07T17:20:31.467266" elapsed="0.000208"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.467676" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:31.463342" elapsed="0.004540"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:31.129111" elapsed="0.338920"/>
</kw>
<msg time="2026-04-07T17:20:31.468106" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:31.128299" elapsed="0.339875"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport1 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:31.127586" elapsed="0.340702"/>
</kw>
<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-07T17:20:31.470825" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:31.470560" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.470541" elapsed="0.000364"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.471197" 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-07T17:20:31.471298" 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-07T17:20:31.471066" elapsed="0.000258"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.471852" level="INFO">Attempting to execute command "ifconfig vport2 up" on remote system "10.30.171.56" 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-07T17:20:31.471471" elapsed="0.000426"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.472418" level="INFO">${conn_id} = 539</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-07T17:20:31.472063" elapsed="0.000381"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.473321" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:31.473396" 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-07T17:20:31.473051" elapsed="0.000368"/>
</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-07T17:20:31.473571" elapsed="0.000323"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.474737" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:31.792024" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:31 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:31.474421" elapsed="0.317683"/>
</kw>
<msg time="2026-04-07T17:20:31.792162" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:31.474072" elapsed="0.318146"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:31.472651" elapsed="0.319694"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.792694" level="INFO">Executing command 'ifconfig vport2 up'.</msg>
<msg time="2026-04-07T17:20:31.804808" level="INFO">Command exited with return code 255.</msg>
<msg time="2026-04-07T17:20:31.804957" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:31.805044" level="INFO">${stderr} = vport2: ERROR while getting interface flags: No such device</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:31.792517" elapsed="0.012561"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.805302" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.806226" level="INFO">vport2: ERROR while getting interface flags: No such device</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:31.805827" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.806555" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.806392" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.806364" elapsed="0.000285"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:31.806863" elapsed="0.000035"/>
</return>
<status status="PASS" start="2026-04-07T17:20:31.806721" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.806700" elapsed="0.000298"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.807047" elapsed="0.000019"/>
</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-07T17:20:31.810605" elapsed="0.000454"/>
</kw>
<kw name="Open 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-07T17:20:31.811281" elapsed="0.000205"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.811685" elapsed="0.000133"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:31.807454" elapsed="0.004434"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:31.470026" elapsed="0.342009"/>
</kw>
<msg time="2026-04-07T17:20:31.812108" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:31.469261" elapsed="0.342913"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>ifconfig vport2 up</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:31.468554" elapsed="0.343728"/>
</kw>
<doc>Create Tap Device vport1 and vport2 to add to the bridge br-s1 using OVS command.</doc>
<status status="PASS" start="2026-04-07T17:20:30.403327" elapsed="1.409031"/>
</kw>
<doc>Create tap devices to add to the bridge in ovs</doc>
<status status="PASS" start="2026-04-07T17:20:30.093616" elapsed="1.718898"/>
</test>
<test id="s1-s2-s1-t33" name="Add Tap Device Manually and Verify After Recover" line="162">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:31.816962" elapsed="0.000307"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:31.816606" elapsed="0.000737"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.818721" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.818566" elapsed="0.000219"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.818539" elapsed="0.000278"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.825163" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.825012" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.824985" elapsed="0.000271"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.826702" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:31.826171" elapsed="0.000568"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.827228" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:31.826903" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:31.827298" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:31.827449" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:31.825561" elapsed="0.001912"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.833196" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.833086" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.833066" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.834544" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.834436" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.834417" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:31.835165" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:31.834751" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.835616" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:31.835346" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.863908" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:31.836202" elapsed="0.027896"/>
</kw>
<msg time="2026-04-07T17:20:31.864273" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:31.864321" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.835796" elapsed="0.028561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.920805" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:31.864928" elapsed="0.056121"/>
</kw>
<msg time="2026-04-07T17:20:31.921222" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:31.921268" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.864528" elapsed="0.056776"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:31.921606" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:31.921386" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.921362" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:31.922261" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:31.921850" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:31.922628" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:31.922417" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.922399" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:31.922759" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:31.925158" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:31.926615" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:31.928032" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:31.923623" elapsed="0.004799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:31.923044" elapsed="0.005492"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:31.834133" elapsed="0.094503"/>
</kw>
<msg time="2026-04-07T17:20:31.928731" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:31.928774" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.833409" elapsed="0.095403"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:31.929090" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:31.928979" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.928941" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:31.929574" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:31.929905" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.930002" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:31.832731" elapsed="0.097383"/>
</kw>
<msg time="2026-04-07T17:20:31.930206" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:31.930248" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.827918" elapsed="0.102368"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:31.930605" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:31.930360" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.930343" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:31.827779" elapsed="0.102926"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.936207" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.936097" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.936078" elapsed="0.000397"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:31.937712" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:31.937600" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:31.937582" elapsed="0.000197"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:31.938298" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:31.937917" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.938727" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:31.938477" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:31.967482" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:31.939307" elapsed="0.028350"/>
</kw>
<msg time="2026-04-07T17:20:31.967827" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:31.967872" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.938906" elapsed="0.029003"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.041854" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:31.968504" elapsed="0.073813"/>
</kw>
<msg time="2026-04-07T17:20:32.042692" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:32.042791" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.968100" elapsed="0.074774"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.043595" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.043104" elapsed="0.000705"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.043056" elapsed="0.000818"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.045234" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.044232" elapsed="0.001279"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.046194" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.045666" elapsed="0.000700"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.045625" elapsed="0.000796"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:32.046494" elapsed="0.000062"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.050118" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.051563" elapsed="0.000508"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:32.052982" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.048513" elapsed="0.004860"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:32.047112" elapsed="0.006376"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:31.937303" elapsed="0.116285"/>
</kw>
<msg time="2026-04-07T17:20:32.053679" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:32.053722" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.936635" elapsed="0.117124"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:32.053944" elapsed="0.000041"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.053836" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.053816" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.054430" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.054756" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.054827" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:31.935741" elapsed="0.119193"/>
</kw>
<msg time="2026-04-07T17:20:32.055055" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:32.055101" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.930965" elapsed="0.124171"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.055456" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.055212" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.055195" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:31.930829" elapsed="0.124725"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.061011" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.060887" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.060868" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.062267" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.062160" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.062141" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:32.062824" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.062473" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.063268" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:32.063017" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.088236" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:32.063854" elapsed="0.024546"/>
</kw>
<msg time="2026-04-07T17:20:32.088851" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:32.088899" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.063446" elapsed="0.025490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.150408" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:32.089509" elapsed="0.061094"/>
</kw>
<msg time="2026-04-07T17:20:32.150796" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:32.150843" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.089121" elapsed="0.061758"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.151210" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.150957" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.150937" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.151820" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "A "d "d "[C "T "a "p "[C "D "e "v "i "c "e "[C "M "a "n "u "a "l "l "y "[78C[C "[A[78Ca
 "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.151447" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.152200" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.151987" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.151953" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:32.152333" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.154640" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.156123" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:32.157505" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.153177" elapsed="0.004723"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:32.152584" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:32.061832" elapsed="0.096299"/>
</kw>
<msg time="2026-04-07T17:20:32.158221" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:32.158265" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.061224" elapsed="0.097076"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:32.158481" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.158375" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.158357" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.158957" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.159295" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.159366" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:32.060542" elapsed="0.098931"/>
</kw>
<msg time="2026-04-07T17:20:32.159565" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:32.159608" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.055818" elapsed="0.103825"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.160020" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.159754" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.159736" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:32.055683" elapsed="0.104439"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:31.827589" elapsed="0.332563"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:31.824496" elapsed="0.335711"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:31.818163" elapsed="0.342098"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:31.817546" elapsed="0.342759"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:31.813784" elapsed="0.346574"/>
</kw>
<kw name="Add Sample Tap Device To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:20:32.168331" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.168073" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.168055" elapsed="0.000357"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.168689" 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-07T17:20:32.168788" 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-07T17:20:32.168554" elapsed="0.000260"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.169360" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2" on remote system "10.30.171.56" 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-07T17:20:32.168962" elapsed="0.000443"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.169916" level="INFO">${conn_id} = 544</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-07T17:20:32.169556" elapsed="0.000386"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.171114" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:32.171190" 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-07T17:20:32.170819" elapsed="0.000394"/>
</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-07T17:20:32.171365" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.172520" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:32.544987" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:31 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:32.172207" elapsed="0.372874"/>
</kw>
<msg time="2026-04-07T17:20:32.545140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.171841" elapsed="0.373359"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:32.170409" elapsed="0.374878"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.545666" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2'.</msg>
<msg time="2026-04-07T17:20:32.628761" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:32.629046" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:32.629149" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': coul...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:32.545473" elapsed="0.083730"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:32.629643" elapsed="0.000854"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.631507" level="INFO">ovs-vsctl: Error detected while setting up 'vport1': could not open network device vport1 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: Error detected while setting up 'vport2': could not open network device vport2 (No such device).  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.630892" elapsed="0.000718"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.632097" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.631791" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.631739" elapsed="0.000511"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:32.632592" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.632364" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.632332" elapsed="0.000456"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.632868" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.638649" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.639381" elapsed="0.000209"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:32.639789" elapsed="0.000131"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.633553" elapsed="0.006459"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:32.167537" elapsed="0.472601"/>
</kw>
<msg time="2026-04-07T17:20:32.640210" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.166990" elapsed="0.473285"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vport1 -- add-port br-s1 vport2</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:32.166439" elapsed="0.473942"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.641117" level="INFO">${dictionary_operational} = {'vport1': '2', 'vport2': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vport1=2</arg>
<arg>vport2=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.640630" elapsed="0.000523"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.641817" level="INFO">${dictionary_config} = {'vport1': '0', 'vport2': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vport1=0</arg>
<arg>vport2=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.641396" elapsed="0.000457"/>
</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-07T17:20:32.654172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:32.653774" elapsed="0.000588"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.654822" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:32.654520" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:32.654892" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.655061" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.653402" elapsed="0.001684"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.660323" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.660027" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.660394" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.660538" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.659673" elapsed="0.000889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.668857" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.668605" elapsed="0.000298"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.669313" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.669069" elapsed="0.000651"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.677130" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.677283" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.677398" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.671715" elapsed="0.005709"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.669793" elapsed="0.007672"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.677641" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.677492" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.669774" elapsed="0.007953"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.680948" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.678759" elapsed="0.002251"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.678543" elapsed="0.002502"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.678525" elapsed="0.002545"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.683769" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.681343" elapsed="0.002489"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.681126" elapsed="0.002753"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.681108" elapsed="0.002806"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.684700" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.684152" elapsed="0.000585"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.685177" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.684835" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.685940" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.685510" elapsed="0.000491"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.685293" elapsed="0.000760"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.684809" elapsed="0.001275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.686806" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.686298" elapsed="0.000545"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.687279" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.686939" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.688037" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.687601" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.687391" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.686913" elapsed="0.001242"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.688355" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.689478" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.689075" elapsed="0.000440"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.689723" elapsed="0.002971"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.678118" elapsed="0.014663"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.693047" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.692878" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.692852" elapsed="0.000317"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.693369" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.693516" elapsed="0.000023"/>
</return>
<msg time="2026-04-07T17:20:32.696083" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.660891" elapsed="0.035220"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.696162" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.696310" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:32.659194" elapsed="0.037141"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.697497" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.697117" elapsed="0.000448"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.696951" elapsed="0.000654"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.698230" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.697847" elapsed="0.000446"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.697686" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.696820" elapsed="0.001541"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.696558" elapsed="0.001856"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:32.655291" elapsed="0.043158"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.703787" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.703487" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.703860" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.704024" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.703148" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.710166" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.709895" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.710599" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.710361" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.724193" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.724379" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.724547" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.712602" elapsed="0.011993"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.710712" elapsed="0.013963"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.725098" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.724733" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.710691" elapsed="0.014599"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.732515" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.727556" elapsed="0.005062"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.727074" elapsed="0.005620"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.727032" elapsed="0.005718"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.736331" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.733394" elapsed="0.002982"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.732873" elapsed="0.003537"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.732836" elapsed="0.003598"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.736956" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.736589" elapsed="0.000409"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.737339" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.737070" elapsed="0.000329"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.737899" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.737600" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.737423" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.737052" elapsed="0.000947"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.738515" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.738154" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.738845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.738611" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.739393" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.739099" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.738925" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.738593" elapsed="0.000883"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.739619" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.740409" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.740137" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.740583" elapsed="0.002275"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.726101" elapsed="0.016819"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.743111" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.743004" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.742984" elapsed="0.000212"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.743339" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.743409" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:20:32.745557" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.704371" elapsed="0.041214"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.745635" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.745790" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:32.702650" elapsed="0.043164"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.746962" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.746593" elapsed="0.000451"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.746445" elapsed="0.000638"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.747672" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.747311" elapsed="0.000423"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.747163" elapsed="0.000609"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.746316" elapsed="0.001485"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.746049" elapsed="0.001804"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:32.698536" elapsed="0.049351"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.753045" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.752735" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.753116" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.753261" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.752399" elapsed="0.000886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.759445" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.759197" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.759879" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.759639" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.770869" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.770989" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.771082" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.761907" elapsed="0.009201"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.760005" elapsed="0.011145"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.771324" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.771176" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.759985" elapsed="0.011424"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.776068" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.772728" elapsed="0.003406"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.772430" elapsed="0.003752"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.772405" elapsed="0.003813"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.779573" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.776602" elapsed="0.003033"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.776296" elapsed="0.003388"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.776272" elapsed="0.003446"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.780474" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.779938" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.780929" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.780610" elapsed="0.000421"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.781759" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.781320" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.781067" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.780584" elapsed="0.001286"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.782412" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.782051" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.782732" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.782507" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.783271" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.782964" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.782812" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.782489" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.783496" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.784284" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.784015" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.784457" elapsed="0.002115"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.771809" elapsed="0.014825"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.786855" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.786706" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.786685" elapsed="0.000258"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.787101" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.787173" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:32.789299" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.753662" elapsed="0.035664"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.789380" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.789530" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:32.751909" elapsed="0.037653"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.790713" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.790344" elapsed="0.000434"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.790195" elapsed="0.000622"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.791419" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.791059" elapsed="0.000422"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.790895" elapsed="0.000625"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.790065" elapsed="0.001484"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.789783" elapsed="0.001817"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:32.747989" elapsed="0.043645"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:32.655147" elapsed="0.136514"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.652819" elapsed="0.138891"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:20:32.642122" elapsed="0.149639"/>
</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-07T17:20:32.801310" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:32.800900" elapsed="0.000437"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.801791" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:32.801493" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:32.801860" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:32.802030" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.800536" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.807480" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.807186" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.807551" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:32.807695" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.806834" elapsed="0.000885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.817921" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.817665" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.818370" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.818131" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.827360" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.828486" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.828651" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.820392" elapsed="0.008296"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.818481" elapsed="0.010280"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.829026" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.828798" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.818462" elapsed="0.010686"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.833790" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.830545" elapsed="0.003337"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.830245" elapsed="0.003684"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.830220" elapsed="0.003744"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.837393" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.834412" elapsed="0.003043"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.834064" elapsed="0.003438"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.834040" elapsed="0.003499"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.838202" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.837785" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.838529" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.838299" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.839077" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.838764" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.838610" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.838281" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.839675" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.839315" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.840019" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.839775" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.840546" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.840253" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.840101" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.839757" elapsed="0.000894"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.840795" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.841585" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.841311" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.841758" elapsed="0.002286"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.829637" elapsed="0.014470"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.844281" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.844177" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.844158" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.844505" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.844585" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:32.846820" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.808059" elapsed="0.038789"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.846900" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.847066" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:32.806349" elapsed="0.040743"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.848235" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.847848" elapsed="0.000465"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.847702" elapsed="0.000651"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.848975" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.848600" elapsed="0.000455"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.848432" elapsed="0.000663"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.847574" elapsed="0.001550"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.847312" elapsed="0.001863"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:32.802235" elapsed="0.047010"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.854409" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.854113" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.854481" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.854626" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.853757" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.860772" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.860527" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.861219" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.860979" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.875663" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.876177" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.876456" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.863212" elapsed="0.013302"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.861328" elapsed="0.015280"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.877034" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.876666" elapsed="0.000515"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.861310" elapsed="0.015919"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.884981" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.879474" elapsed="0.005636"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.878954" elapsed="0.006191"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.878913" elapsed="0.006259"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.887572" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.885449" elapsed="0.002168"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.885229" elapsed="0.002422"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.885211" elapsed="0.002465"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.888242" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.887841" elapsed="0.000430"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.888569" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.888341" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.889118" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.888804" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.888652" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.888323" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.889714" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.889353" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.890052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.889810" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.890577" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.890286" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.890133" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.889792" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.890808" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.891596" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.891327" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.891769" elapsed="0.002135"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.878018" elapsed="0.015960"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.894155" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.894049" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.894031" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.894381" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.894450" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:32.896695" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.854986" elapsed="0.041737"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.896773" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:32.896921" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:32.853281" elapsed="0.043666"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.898106" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.897721" elapsed="0.000464"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.897573" elapsed="0.000651"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.898813" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.898452" elapsed="0.000437"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.898304" elapsed="0.000657"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.897445" elapsed="0.001562"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.897185" elapsed="0.001877"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:32.849335" elapsed="0.049761"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.904287" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.903960" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:32.904359" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:32.904506" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:32.903620" elapsed="0.000911"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.910822" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.910575" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.911269" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.911029" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:32.924038" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:32.924439" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '3129'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:32.924651" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:32.913278" elapsed="0.011432"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.911379" elapsed="0.013408"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.925063" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.924832" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.911360" elapsed="0.013823"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.929816" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"d4909dbc-7310-47f0-9c19-d50a56a0a48e","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"688e41e1-0cf5-49a3-aacb-3d70f9c47e78","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"daa486d4-80b4-4449-9d5a-cae141a91ca8","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"be:9d:90:d4:f0:47","ovsdb:ofport":65534,"ovsdb:ifindex":14},{"tp-id":"vport2","ovsdb:port-uuid":"233b2081-4478-4778-aad7-85f34f8f6fcf","ovsdb:interface-uuid":"39730594-31b6-455a-8871-c9952a2231f9","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport2","ovsdb:ingress-policing-rate":0},{"tp-id":"vx1","ovsdb:port-uuid":"953d7d15-05cd-4836-8b46-b9efccd31672","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"6ae34dc1-09d6-4afa-994c-81e099daac8f","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"},{"tp-id":"vport1","ovsdb:port-uuid":"2e1d1c4e-1640-496f-aa4e-dcd685dcbd45","ovsdb:interface-uuid":"551ce269-7894-4ddc-93b0-e9cd8bec5ea6","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vport1","ovsdb:ingress-policing-rate":0}],"ovsdb:datapath-id":"00:00:be:9d:90:d4:f0:47"},{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.926580" elapsed="0.003384"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.926277" elapsed="0.003757"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.926251" elapsed="0.003819"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.933295" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:32.930450" elapsed="0.002891"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.930147" elapsed="0.003228"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.930124" elapsed="0.003277"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.933927" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.933559" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.934271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.934040" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.934805" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.934504" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.934352" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.934021" elapsed="0.000867"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.935415" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.935055" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.935734" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:32.935509" elapsed="0.000293"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.936295" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:32.935998" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:32.935826" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.935491" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:32.936522" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:32.937305" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:32.937036" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.937477" elapsed="0.002105"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:32.925670" elapsed="0.013973"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:32.939828" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:32.939711" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.939692" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:32.940076" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.940146" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:32.942377" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:32.904852" elapsed="0.037553"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:32.942458" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:32.942606" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:20:32.903138" elapsed="0.039494"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.943795" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.943406" elapsed="0.000468"/>
</kw>
<var name="${item}">vport1</var>
<status status="PASS" start="2026-04-07T17:20:32.943258" elapsed="0.000656"/>
</iter>
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.944521" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:32.944162" elapsed="0.000436"/>
</kw>
<var name="${item}">vport2</var>
<status status="PASS" start="2026-04-07T17:20:32.944014" elapsed="0.000658"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:32.943129" elapsed="0.001575"/>
</for>
<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="PASS" start="2026-04-07T17:20:32.942850" elapsed="0.001907"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:32.899182" elapsed="0.045609"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:32.802105" elapsed="0.142713"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.799974" elapsed="0.144893"/>
</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_operational}</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-07T17:20:32.791945" elapsed="0.152974"/>
</kw>
<doc>Add Tap Device vport1 and vport2 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.164411" elapsed="0.780587"/>
</kw>
<doc>Add tap devices to the bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:20:31.812932" elapsed="1.132187"/>
</test>
<test id="s1-s2-s1-t34" name="Delete the Bridge Manually and Verify After Recover" line="166">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:32.948610" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:32.948335" 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-07T17:20:32.949846" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.949736" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.949718" 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-07T17:20:32.954448" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.954341" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.954323" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.955492" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:32.955115" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:32.956027" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:32.955695" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:32.956097" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:32.956250" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:32.954731" elapsed="0.001543"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.961310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.961201" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.961181" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:32.962611" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:32.962506" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:32.962488" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:32.963189" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:32.962816" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.963644" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:32.963370" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:32.994696" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:32.964232" elapsed="0.030622"/>
</kw>
<msg time="2026-04-07T17:20:32.995079" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:32.995125" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.963824" elapsed="0.031335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.060260" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:32.995736" elapsed="0.064770"/>
</kw>
<msg time="2026-04-07T17:20:33.060677" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:33.060722" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.995341" elapsed="0.065416"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.061080" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.060838" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.060816" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.061691" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.061317" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.062066" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.061840" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.061822" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:33.062199" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.064499" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:20:33.065926" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:33.067364" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.063066" elapsed="0.004691"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:33.062458" elapsed="0.005412"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:32.962204" elapsed="0.105779"/>
</kw>
<msg time="2026-04-07T17:20:33.068077" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.068121" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.961522" elapsed="0.106633"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:33.068338" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.068232" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.068213" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.068816" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.069162" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.069234" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:32.960854" elapsed="0.108487"/>
</kw>
<msg time="2026-04-07T17:20:33.069431" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.069474" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.956625" elapsed="0.112884"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.069828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.069582" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.069565" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:32.956488" elapsed="0.113440"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.075171" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.075062" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.075042" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.076765" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.076657" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.076639" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:33.077343" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.076984" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.077770" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:33.077520" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.109184" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:33.078374" elapsed="0.030965"/>
</kw>
<msg time="2026-04-07T17:20:33.109507" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:33.109554" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.077948" elapsed="0.031640"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.176324" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:33.110184" elapsed="0.066338"/>
</kw>
<msg time="2026-04-07T17:20:33.176697" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:33.176744" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.109754" elapsed="0.067025"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.177112" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.176860" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.176839" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.177742" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.177354" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.178128" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.177895" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.177877" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:33.178262" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.180725" elapsed="0.000707"/>
</kw>
<kw name="Open 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-07T17:20:33.182370" elapsed="0.000469"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:33.183755" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.179278" elapsed="0.004887"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:33.178513" elapsed="0.005768"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:33.076356" elapsed="0.108025"/>
</kw>
<msg time="2026-04-07T17:20:33.184475" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.184518" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.075430" elapsed="0.109123"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:33.184743" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.184630" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.184611" elapsed="0.000215"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.185280" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.185609" elapsed="0.000046"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.185705" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:33.074702" elapsed="0.111111"/>
</kw>
<msg time="2026-04-07T17:20:33.185904" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.185947" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.070214" elapsed="0.115795"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.186331" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.186085" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.186068" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:33.070078" elapsed="0.116353"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.191488" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.191380" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.191361" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.192987" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.192865" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.192847" elapsed="0.000209"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:33.193541" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.193192" elapsed="0.000389"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.194005" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:33.193739" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.223256" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:33.194562" elapsed="0.028873"/>
</kw>
<msg time="2026-04-07T17:20:33.223607" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:33.223652" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.194185" elapsed="0.029502"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.285572" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:33.224262" elapsed="0.061575"/>
</kw>
<msg time="2026-04-07T17:20:33.286073" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:33.286120" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.223857" elapsed="0.062298"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.286574" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.286269" elapsed="0.000389"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.286233" elapsed="0.000454"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.287297" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.286829" elapsed="0.000554"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.287659" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.287449" elapsed="0.000344"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.287431" elapsed="0.000388"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:33.287857" elapsed="0.000039"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.290351" elapsed="0.000542"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.291831" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:33.293302" elapsed="0.000554"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.288813" elapsed="0.005116"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:33.288186" elapsed="0.005899"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:33.192550" elapsed="0.101638"/>
</kw>
<msg time="2026-04-07T17:20:33.294278" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.294322" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.191702" elapsed="0.102655"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:33.294543" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.294434" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.294415" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.295039" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.295410" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.295483" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:33.191042" elapsed="0.104548"/>
</kw>
<msg time="2026-04-07T17:20:33.295683" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:33.295726" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.186683" elapsed="0.109077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.296199" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.295833" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.295817" elapsed="0.000460"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:33.186550" elapsed="0.109750"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:32.956324" elapsed="0.340011"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:32.953986" elapsed="0.342411"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:32.949455" elapsed="0.347004"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:32.949032" elapsed="0.347476"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:32.945913" elapsed="0.350655"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:20:33.304504" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.304245" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.304226" elapsed="0.000357"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.304897" 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-07T17:20:33.305014" 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-07T17:20:33.304755" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.305601" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:20:33.305225" elapsed="0.000421"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.306178" level="INFO">${conn_id} = 549</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-07T17:20:33.305796" elapsed="0.000408"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.307101" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:33.307177" 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-07T17:20:33.306799" elapsed="0.000401"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.307354" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.308507" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:33.675706" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:32 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:33.308193" elapsed="0.367651"/>
</kw>
<msg time="2026-04-07T17:20:33.675920" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.307829" elapsed="0.368178"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:33.306414" elapsed="0.369700"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:33.676598" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:20:33.779445" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:33.779566" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:33.779609" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:33.676347" elapsed="0.103285"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:33.779793" elapsed="0.000236"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.780533" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.780234" elapsed="0.000340"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.780811" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.780664" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.780635" elapsed="0.000251"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:33.781076" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.780939" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.780924" elapsed="0.000236"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.781194" 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-07T17:20:33.783904" elapsed="0.000340"/>
</kw>
<kw name="Open 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-07T17:20:33.784404" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:33.784707" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.781519" elapsed="0.003337"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:33.303658" elapsed="0.481288"/>
</kw>
<msg time="2026-04-07T17:20:33.785022" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.303115" elapsed="0.481957"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:33.302611" elapsed="0.482600"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.785711" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.785390" elapsed="0.000349"/>
</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-07T17:20:33.791694" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:33.791311" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.792201" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:33.791877" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:33.792271" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.792424" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:33.790927" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.797771" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.797470" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:33.797841" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.798001" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.797129" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.860804" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.860411" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.861286" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.861039" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:33.869818" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:33.870029" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:33.870152" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:33.863335" elapsed="0.006842"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.861414" elapsed="0.008805"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.870400" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.870250" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.861388" elapsed="0.009097"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.873828" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.871543" elapsed="0.002406"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.871327" elapsed="0.002671"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.871309" elapsed="0.002714"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.876424" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.874296" elapsed="0.002173"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.874079" elapsed="0.002424"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.874062" elapsed="0.002466"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.877265" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.876699" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.877722" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.877400" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.878489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.878074" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.877835" elapsed="0.000739"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.877375" elapsed="0.001229"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.879341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.878820" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.879786" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.879473" elapsed="0.000392"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.880555" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.880133" elapsed="0.000458"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.879899" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.879448" elapsed="0.001222"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.880873" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:33.882018" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.881593" elapsed="0.000462"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.882262" elapsed="0.002961"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:33.870873" elapsed="0.014439"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:33.885557" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.885408" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.885382" elapsed="0.000304"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.885883" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.886001" elapsed="0.000022"/>
</return>
<msg time="2026-04-07T17:20:33.888941" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:33.798362" elapsed="0.090620"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:33.889036" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:33.889186" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:20:33.796612" elapsed="0.092599"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.890388" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:33.890009" elapsed="0.000449"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:33.889845" elapsed="0.000652"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:33.889703" elapsed="0.000826"/>
</for>
<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="PASS" start="2026-04-07T17:20:33.889437" elapsed="0.001144"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:33.792659" elapsed="0.097990"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.895963" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.895666" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:33.896052" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.896207" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.895332" elapsed="0.000900"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.902307" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.902059" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.902739" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.902499" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:33.915000" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:33.915149" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:33.915290" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:33.904746" elapsed="0.010569"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.902854" elapsed="0.012505"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.915533" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.915384" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.902835" elapsed="0.012781"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.920288" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.917028" elapsed="0.003338"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.916708" elapsed="0.003705"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.916682" elapsed="0.003766"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.923763" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.920825" elapsed="0.003001"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.920524" elapsed="0.003523"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.920501" elapsed="0.003583"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.924836" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.924300" elapsed="0.000569"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.925194" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.924950" elapsed="0.000337"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.925770" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.925471" elapsed="0.000325"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.925315" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.924932" elapsed="0.000920"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.926379" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.926020" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.926698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.926474" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.927237" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.926930" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.926779" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.926456" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.927464" elapsed="0.000336"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:33.928261" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.927990" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.928435" elapsed="0.002229"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:33.916128" elapsed="0.014597"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:33.930897" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.930795" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.930776" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.931138" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.931208" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:33.933376" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:33.896552" elapsed="0.036852"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:33.933455" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.933603" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:20:33.894836" elapsed="0.038793"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.934766" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:33.934394" elapsed="0.000439"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:33.934248" elapsed="0.000626"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:33.934121" elapsed="0.000781"/>
</for>
<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="PASS" start="2026-04-07T17:20:33.933846" elapsed="0.001106"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:33.890744" elapsed="0.044257"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.940157" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.939823" elapsed="0.000360"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:33.940228" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.940372" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:33.939489" elapsed="0.000907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.946474" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.946228" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.946906" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.946665" elapsed="0.000337"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:33.960261" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:33.960533" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:20:33.960730" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:33.948991" elapsed="0.011796"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.947072" elapsed="0.013809"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.961306" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.960937" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.947053" elapsed="0.014447"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.969257" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":59846,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.963746" elapsed="0.005637"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.963249" elapsed="0.006211"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.963208" elapsed="0.006309"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.973848" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:33.970163" elapsed="0.003730"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.969644" elapsed="0.004284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.969606" elapsed="0.004348"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.974501" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.974127" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.974829" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.974599" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.975378" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.975080" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.974910" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.974581" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.975999" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.975623" elapsed="0.000403"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.976323" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:33.976096" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.976924" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:33.976630" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:33.976470" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.976077" elapsed="0.000946"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:33.977167" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:33.977935" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:33.977666" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:33.978126" elapsed="0.002116"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:33.962286" elapsed="0.018018"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:33.980477" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:33.980374" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.980355" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:33.980703" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.980772" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:33.982931" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:33.940713" elapsed="0.042246"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:33.983029" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:33.983179" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/f72038e3-f28b-4edd-aba9-2c02ed31546c","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:20:33.939013" elapsed="0.044192"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.984371" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:33.984001" elapsed="0.000438"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:20:33.983838" elapsed="0.000641"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:33.983708" elapsed="0.000800"/>
</for>
<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="PASS" start="2026-04-07T17:20:33.983424" elapsed="0.001134"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:33.935089" elapsed="0.049502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:33.792509" elapsed="0.192111"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:20:33.790365" elapsed="0.194303"/>
</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-07T17:20:33.785919" elapsed="0.198802"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:20:33.300585" elapsed="0.684197"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:20:32.945331" elapsed="1.039565"/>
</test>
<test id="s1-s2-s1-t35" name="Verify Modified Port After Recover" line="170">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:33.988025" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:33.987751" elapsed="0.000532"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:33.989247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.989139" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.989120" 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-07T17:20:33.993953" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:33.993846" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:33.993828" elapsed="0.000210"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.995054" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:33.994622" elapsed="0.000460"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:33.995563" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:33.995236" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:33.995633" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:33.995791" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:33.994255" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.000816" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.000703" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.000684" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.002115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.002007" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.001988" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:34.002677" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:34.002322" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.003137" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:34.002857" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.031698" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:34.003716" elapsed="0.028153"/>
</kw>
<msg time="2026-04-07T17:20:34.032127" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:34.032175" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.003317" elapsed="0.028894"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.082429" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:34.032779" elapsed="0.049834"/>
</kw>
<msg time="2026-04-07T17:20:34.082795" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:34.082841" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.032382" elapsed="0.050494"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.083208" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.082955" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.082934" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.083817" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:34.083447" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.084190" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.083962" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.083944" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:34.084323" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:34.086649" elapsed="0.000565"/>
</kw>
<kw name="Open 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-07T17:20:34.088151" elapsed="0.000622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:34.089741" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:34.085182" elapsed="0.004977"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:34.084580" elapsed="0.005693"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:34.001685" elapsed="0.088687"/>
</kw>
<msg time="2026-04-07T17:20:34.090462" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.090505" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.001043" elapsed="0.089497"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:34.090735" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:34.090617" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.090598" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.091222" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.091547" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.091619" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:34.000369" elapsed="0.091358"/>
</kw>
<msg time="2026-04-07T17:20:34.091819" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.091862" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.996182" elapsed="0.095715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.092231" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.091984" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.091953" elapsed="0.000355"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:33.996045" elapsed="0.096285"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.097326" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.097219" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.097200" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.098570" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.098463" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.098445" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:34.099173" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:34.098804" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.099600" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:34.099352" elapsed="0.000273"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.129454" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:34.100177" elapsed="0.029456"/>
</kw>
<msg time="2026-04-07T17:20:34.129798" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:34.129844" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.099779" elapsed="0.030099"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.180874" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:34.130455" elapsed="0.050635"/>
</kw>
<msg time="2026-04-07T17:20:34.181255" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:34.181300" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.130060" elapsed="0.051408"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.181769" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.181550" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.181530" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.182471" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:34.182043" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.182827" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.182618" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.182600" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:34.182959" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:34.185372" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:20:34.186814" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:34.188210" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:34.183831" elapsed="0.004770"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:34.183228" elapsed="0.005485"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:34.098165" elapsed="0.090648"/>
</kw>
<msg time="2026-04-07T17:20:34.188904" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.188948" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.097540" elapsed="0.091457"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:34.189183" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:34.189076" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.189057" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.189638" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.190184" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.190257" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:34.096860" elapsed="0.093507"/>
</kw>
<msg time="2026-04-07T17:20:34.190459" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.190502" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.092583" elapsed="0.097953"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.190853" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.190610" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.190593" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:34.092448" elapsed="0.098504"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.196133" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.196022" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.195963" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.197457" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.197352" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.197334" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:34.198089" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:34.197705" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.198520" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:34.198270" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.228446" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:34.199093" elapsed="0.029510"/>
</kw>
<msg time="2026-04-07T17:20:34.228770" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:34.228816" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.198700" elapsed="0.030150"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:34.281581" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:34.229423" elapsed="0.052615"/>
</kw>
<msg time="2026-04-07T17:20:34.282419" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:34.282520" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.229037" elapsed="0.053559"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.283325" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.282781" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.282736" elapsed="0.000811"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.284699" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "t "[C "A "f "[78Ct "[A[78Ce
 "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:34.283853" elapsed="0.001033"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.285586" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.285072" elapsed="0.000680"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.285030" elapsed="0.000776"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:34.285887" elapsed="0.000070"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:34.288427" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:20:34.289861" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:34.291298" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:34.286950" elapsed="0.004736"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:34.286368" elapsed="0.005429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:34.196959" elapsed="0.094937"/>
</kw>
<msg time="2026-04-07T17:20:34.292014" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.292059" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.196349" elapsed="0.095745"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:34.292278" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:34.292172" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.292153" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.292739" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.293120" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.293191" elapsed="0.000025"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:34.195640" elapsed="0.097668"/>
</kw>
<msg time="2026-04-07T17:20:34.293399" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:34.293442" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:34.191221" elapsed="0.102255"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.293792" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.293550" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:34.293533" elapsed="0.000341"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:34.191087" elapsed="0.102810"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:33.995865" elapsed="0.298061"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:33.993483" elapsed="0.300674"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:33.988840" elapsed="0.305375"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:33.988428" elapsed="0.305832"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:33.985787" elapsed="0.308525"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.300926" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:34.300579" elapsed="0.000374"/>
</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-07T17:20:34.310691" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:34.310311" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.311196" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:34.310874" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:34.311266" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:34.311418" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:34.309925" elapsed="0.001517"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.316777" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:34.316478" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:34.316848" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:34.317008" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:34.316136" elapsed="0.000898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.323137" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:34.322870" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:34.323571" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:34.323331" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:34.333063" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:34.333194" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:34.333342" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:34.325703" elapsed="0.008086">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:34.323682" elapsed="0.010250">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.334219" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:34.334007" elapsed="0.000302"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:34.323662" elapsed="0.010680">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.334857" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.335063" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:34.335011" elapsed="0.000110"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:34.334985" elapsed="0.000166"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:34.335344" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.335439" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:34.317363" elapsed="0.018223">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:34.335669" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-04-07T17:20:34.315565" elapsed="0.020232">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:34.336129" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:34.311626" elapsed="0.024611">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:34.311492" elapsed="0.024824">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:34.309275" elapsed="0.027165">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:35.354549" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:35.354020" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:35.355093" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:35.354759" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:35.355167" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:20:35.355351" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:35.353603" elapsed="0.001773"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:35.360822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:35.360523" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:35.361001" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:35.361152" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:35.360184" elapsed="0.000993"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:35.367701" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:35.367442" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:35.368162" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:35.367899" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:35.377152" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:35.377295" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:35.377401" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:35.370213" elapsed="0.007579">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:35.368280" elapsed="0.009596">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:35.378087" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:35.377910" elapsed="0.000244"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:35.368259" elapsed="0.009919">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:35.378549" elapsed="0.000024"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:35.378680" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:35.378644" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:35.378627" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:35.378885" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:35.378953" elapsed="0.000029"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:35.361523" elapsed="0.017550">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:35.379133" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:20:35.359676" elapsed="0.019550">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:35.379453" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:35.355590" elapsed="0.023941">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:35.355440" elapsed="0.024149">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:35.352726" elapsed="0.026988">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:36.394833" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:36.394331" elapsed="0.000536"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:36.395462" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:36.395052" elapsed="0.000437"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:36.395538" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:20:36.395716" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:36.393920" elapsed="0.001821"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:36.401151" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:36.400824" elapsed="0.000354"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:36.401224" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:36.401371" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:36.400478" elapsed="0.000917"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:36.407738" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:36.407483" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:36.408212" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:36.407940" elapsed="0.000316"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:36.418410" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:36.418567" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:36.418676" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:36.410238" elapsed="0.008862">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:36.408330" elapsed="0.010854">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:36.419371" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:36.419219" elapsed="0.000217"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:36.408309" elapsed="0.011150">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:36.419831" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:36.419964" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:36.419928" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:36.419911" elapsed="0.000147"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:36.420266" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:36.420339" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:36.401737" elapsed="0.018707">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:36.420505" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:20:36.399903" elapsed="0.020693">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:36.420825" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:36.395953" elapsed="0.024955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:36.395806" elapsed="0.025176">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:36.393054" elapsed="0.028025">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:37.437411" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:37.436813" elapsed="0.000636"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:37.437952" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:37.437626" elapsed="0.000368"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:37.438047" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:20:37.438240" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:37.436404" elapsed="0.001861"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:37.443693" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:37.443353" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:37.443767" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:37.443912" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:37.443008" elapsed="0.000928"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:37.450457" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:37.450195" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:37.451027" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:37.450685" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:37.461337" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:37.461504" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:37.461694" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:37.453309" elapsed="0.008846">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:37.451175" elapsed="0.011069">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:37.462458" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:37.462280" elapsed="0.000253"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:37.451147" elapsed="0.011410">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:37.462997" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:37.463136" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:37.463100" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:37.463082" elapsed="0.000118"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:37.463341" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:37.463411" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:37.444307" elapsed="0.019210">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:37.463579" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:20:37.442472" elapsed="0.021198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:37.463908" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:37.438487" elapsed="0.025512">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:37.438333" elapsed="0.025729">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:37.435517" elapsed="0.028638">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:38.481408" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:38.480901" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:38.481953" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:38.481610" elapsed="0.000388"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:38.482050" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:20:38.482245" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:38.480500" elapsed="0.001771"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:38.487707" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:38.487394" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:38.487856" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:20:38.488035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:38.487045" elapsed="0.001016"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:38.496543" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:38.496274" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:38.497034" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:38.496744" elapsed="0.000335"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:38.506946" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:38.507166" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:38.507320" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:38.499252" elapsed="0.008589">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:38.497153" elapsed="0.010847">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:38.508263" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:38.508051" elapsed="0.000305"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:38.497132" elapsed="0.011256">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:38.508910" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:38.509122" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:38.509071" elapsed="0.000108"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:38.509047" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:38.509403" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:38.509499" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:38.488405" elapsed="0.021242">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:38.509730" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:20:38.486496" elapsed="0.023381">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:38.510296" elapsed="0.000036"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:38.482483" elapsed="0.027926">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:38.482333" elapsed="0.028159">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:38.479680" elapsed="0.031001">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:39.527680" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:39.527192" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.528219" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:39.527883" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:39.528296" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:20:39.528475" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:39.526777" elapsed="0.001723"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.533978" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:39.533641" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:39.534054" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:39.534201" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:39.533295" elapsed="0.000930"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.540649" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:39.540387" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.541110" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:39.540846" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:39.550989" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:39.551144" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:39.551255" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:39.543157" elapsed="0.008523">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:39.541233" elapsed="0.010531">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:39.551950" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:39.551799" elapsed="0.000235"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:39.541211" elapsed="0.010847">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:39.552428" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.552559" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:39.552523" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:39.552507" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:39.552830" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.552902" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:39.534584" elapsed="0.018444">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.553091" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:20:39.532790" elapsed="0.020394">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:39.553415" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:39.528723" elapsed="0.024770">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:39.528570" elapsed="0.024983">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:39.525904" elapsed="0.027741">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:20:39.553744" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:20:34.301163" elapsed="5.252673">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:34.298565" elapsed="5.255439">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:33.985257" elapsed="5.568917">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s1-t36" name="Delete Port In New Owner After Recover" line="174">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:39.558532" elapsed="0.000293"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:39.558174" elapsed="0.000728"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.560293" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:39.560140" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:39.560114" elapsed="0.000273"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.566999" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:39.566808" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:39.566783" elapsed="0.000305"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.568081" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:39.567682" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:39.568565" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:39.568263" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:39.568635" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:39.568827" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:39.567311" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.573928" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:39.573816" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:39.573797" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:39.575257" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:39.575143" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:39.575125" elapsed="0.000198"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:39.575833" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:39.575468" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:39.576311" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:39.576043" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:39.605083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:39.576875" elapsed="0.028470"/>
</kw>
<msg time="2026-04-07T17:20:39.605606" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:39.605679" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:39.576493" elapsed="0.029224"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.757105" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:39.606564" elapsed="4.150967"/>
</kw>
<msg time="2026-04-07T17:20:43.757826" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:43.757877" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:39.606012" elapsed="4.151902"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.758459" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.758086" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.758038" elapsed="0.000541"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:43.759246" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:43.758723" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.759616" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.759400" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.759382" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:43.759754" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:43.762348" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:20:43.763812" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:43.765255" elapsed="0.000573"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:43.760732" elapsed="0.005169"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:43.760096" elapsed="0.005957"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:39.574819" elapsed="4.191337"/>
</kw>
<msg time="2026-04-07T17:20:43.766351" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.766395" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:39.574161" elapsed="4.192270"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:43.766618" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:43.766510" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.766492" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.767203" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.767547" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.767619" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:39.573468" elapsed="4.194258"/>
</kw>
<msg time="2026-04-07T17:20:43.767819" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.767864" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:39.569230" elapsed="4.198669"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.768234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.767987" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.767957" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:39.569093" elapsed="4.199243"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.773780" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:43.773671" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.773651" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.775103" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:43.774990" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.774946" elapsed="0.000224"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:43.775666" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:43.775308" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.776118" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:43.775845" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.808135" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:43.776672" elapsed="0.031638"/>
</kw>
<msg time="2026-04-07T17:20:43.808480" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:43.808525" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.776298" elapsed="0.032262"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.868163" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:43.809131" elapsed="0.059219"/>
</kw>
<msg time="2026-04-07T17:20:43.868517" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:43.868562" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.808725" elapsed="0.059872"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.868893" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.868674" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.868655" elapsed="0.000410"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:43.869624" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:43.869249" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.870003" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.869772" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.869753" elapsed="0.000357"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:43.870142" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:43.872424" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:43.873878" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:43.875287" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:43.870980" elapsed="0.004698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:43.870395" elapsed="0.005396"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:43.774663" elapsed="0.101228"/>
</kw>
<msg time="2026-04-07T17:20:43.875997" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.876042" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.774039" elapsed="0.102039"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:43.876262" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:43.876155" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.876137" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.876724" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.877262" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.877338" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:43.773273" elapsed="0.104171"/>
</kw>
<msg time="2026-04-07T17:20:43.877536" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.877579" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.768606" elapsed="0.109007"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.877930" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.877687" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.877670" elapsed="0.000352"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:43.768467" elapsed="0.109578"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.883123" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:43.883005" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.882960" elapsed="0.000231"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.884404" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:43.884297" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.884280" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:43.884956" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:43.884609" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.885441" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:43.885184" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.914473" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:43.886111" elapsed="0.028542"/>
</kw>
<msg time="2026-04-07T17:20:43.914829" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:43.914877" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.885705" elapsed="0.029208"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:43.982448" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:43.915517" elapsed="0.067553"/>
</kw>
<msg time="2026-04-07T17:20:43.983591" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:43.983709" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.915113" elapsed="0.068680"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.984773" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.984101" elapsed="0.000925"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.983961" elapsed="0.001132"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:43.986792" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:43.985426" elapsed="0.001589"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.987758" elapsed="0.000068"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.987182" elapsed="0.000855"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.987137" elapsed="0.000971"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:43.988204" elapsed="0.000090"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:43.993438" elapsed="0.000567"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:43.994990" elapsed="0.000540"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:43.996512" elapsed="0.000369"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:43.990514" elapsed="0.006483"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:43.989181" elapsed="0.007938"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:43.883996" elapsed="0.113232"/>
</kw>
<msg time="2026-04-07T17:20:43.997329" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.997375" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.883342" elapsed="0.114070"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:43.997608" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:43.997495" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.997475" elapsed="0.000220"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.998144" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.998505" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:43.998579" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:43.882644" elapsed="0.116054"/>
</kw>
<msg time="2026-04-07T17:20:43.998893" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:43.998942" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:43.878305" elapsed="0.120689"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:43.999342" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:43.999083" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:43.999064" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:43.878170" elapsed="0.121277"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:39.568904" elapsed="4.430583"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:39.566308" elapsed="4.433247"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:39.559714" elapsed="4.439908"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:39.559127" elapsed="4.440548"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:39.555364" elapsed="4.444372"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:44.011553" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.008041" elapsed="0.003554">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:39.554617" elapsed="4.457142">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t37" name="Delete Bridge In New Owner And Verify After Recover" line="178">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:44.015143" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:44.014867" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.016390" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.016280" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.016262" 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-07T17:20:44.021037" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.020913" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.020895" elapsed="0.000217"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.022109" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:44.021708" elapsed="0.000428"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.022596" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:44.022294" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:44.022666" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:44.022817" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:44.021334" elapsed="0.001509"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.028121" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.028009" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.027990" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.029388" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.029280" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.029263" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.029954" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.029596" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.030419" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.030165" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.054470" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.030989" elapsed="0.023703"/>
</kw>
<msg time="2026-04-07T17:20:44.054869" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.054916" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.030598" elapsed="0.024353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.107236" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.055534" elapsed="0.051889"/>
</kw>
<msg time="2026-04-07T17:20:44.107591" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.107637" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.055139" elapsed="0.052533"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.107992" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.107749" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.107729" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.108613" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.108235" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.108994" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.108768" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.108750" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.109132" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.111412" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:20:44.112878" elapsed="0.000513"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.114302" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.109957" elapsed="0.004733"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.109388" elapsed="0.005415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.028976" elapsed="0.085926"/>
</kw>
<msg time="2026-04-07T17:20:44.115008" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.115053" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.028335" elapsed="0.086753"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.115276" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.115165" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.115147" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.115736" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.116094" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.116166" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.027657" elapsed="0.088616"/>
</kw>
<msg time="2026-04-07T17:20:44.116364" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.116407" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.023235" elapsed="0.093207"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.116822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.116568" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.116549" elapsed="0.000350"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:44.023097" elapsed="0.093825"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.122315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.122208" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.122190" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.123565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.123458" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.123441" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.124139" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.123770" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.124592" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.124316" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.156422" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.125175" elapsed="0.031418"/>
</kw>
<msg time="2026-04-07T17:20:44.156761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.156806" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.124774" elapsed="0.032066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.221483" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.157407" elapsed="0.064268"/>
</kw>
<msg time="2026-04-07T17:20:44.221844" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.221889" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.157021" elapsed="0.064903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.222290" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.222071" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.222049" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.222898" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.222532" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.223283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.223070" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.223050" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.223413" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.225687" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:20:44.227141" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.228582" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.224239" elapsed="0.004759"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.223660" elapsed="0.005494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.123160" elapsed="0.106097"/>
</kw>
<msg time="2026-04-07T17:20:44.229349" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.229397" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.122529" elapsed="0.106902"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.229615" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.229508" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.229489" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.230091" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.230425" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.230495" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.121852" elapsed="0.108748"/>
</kw>
<msg time="2026-04-07T17:20:44.230692" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.230736" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.117297" elapsed="0.113473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.231118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.230845" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.230827" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:44.117161" elapsed="0.114057"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.236591" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.236476" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.236458" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.237828" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.237722" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.237704" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.238401" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.238050" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.238833" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.238581" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.270042" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.239475" elapsed="0.030734"/>
</kw>
<msg time="2026-04-07T17:20:44.270377" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.270424" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.239095" elapsed="0.031363"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.332813" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.271024" elapsed="0.062013"/>
</kw>
<msg time="2026-04-07T17:20:44.333223" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.333275" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.270624" elapsed="0.062692"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.333671" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.333439" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.333418" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.334353" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "w "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.333917" elapsed="0.000524"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.334730" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.334511" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.334492" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.334864" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.337261" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:20:44.338728" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.340194" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.335736" elapsed="0.004873"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.335143" elapsed="0.005580"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.237424" elapsed="0.103401"/>
</kw>
<msg time="2026-04-07T17:20:44.340919" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.340981" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.236804" elapsed="0.104216"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.341210" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.341098" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.341079" elapsed="0.000217"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.341699" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.342064" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.342138" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.236107" elapsed="0.106139"/>
</kw>
<msg time="2026-04-07T17:20:44.342341" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.342387" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.231471" elapsed="0.110960"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.342783" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.342518" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.342500" elapsed="0.000382"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:44.231337" elapsed="0.111570"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:44.022902" elapsed="0.320035"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:44.020531" elapsed="0.322587"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:44.015983" elapsed="0.327194"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.015552" elapsed="0.327673"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:44.012873" elapsed="0.330405"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:44.354979" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.351406" elapsed="0.003613">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.012240" elapsed="0.342924">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t38" name="Create Bridge In Old Owner and Verify After Recover" line="182">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:44.358372" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:44.358106" 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-07T17:20:44.359634" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.359523" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.359505" 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-07T17:20:44.364317" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.364208" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.364190" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.365394" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:44.365001" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.365892" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:44.365578" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:44.365995" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:20:44.366163" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:44.364600" elapsed="0.001587"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.371448" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.371339" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.371321" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.372733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.372623" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.372605" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.373333" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.372948" elapsed="0.000412"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.373765" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.373514" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.403759" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.374377" elapsed="0.029887"/>
</kw>
<msg time="2026-04-07T17:20:44.404638" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.404739" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.373979" elapsed="0.030837"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.479607" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.405540" elapsed="0.074445"/>
</kw>
<msg time="2026-04-07T17:20:44.480240" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.480288" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.405146" elapsed="0.075178"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.480786" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.480449" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.480410" elapsed="0.000590"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.481616" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.481145" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.482006" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.481775" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.481757" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.482144" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.484661" elapsed="0.000539"/>
</kw>
<kw name="Open 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-07T17:20:44.486154" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.487593" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.483095" elapsed="0.004925"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.482456" elapsed="0.005681"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.372319" elapsed="0.115920"/>
</kw>
<msg time="2026-04-07T17:20:44.488334" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.488380" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.371660" elapsed="0.116754"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.488600" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.488492" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.488473" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.489121" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.489465" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.489535" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.370996" elapsed="0.118648"/>
</kw>
<msg time="2026-04-07T17:20:44.489739" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.489783" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.366543" elapsed="0.123277"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.490161" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.489896" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.489879" elapsed="0.000359"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:44.366405" elapsed="0.123857"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.495732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.495614" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.495595" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.497113" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.496877" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.496860" elapsed="0.000323"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.497735" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.497323" elapsed="0.000440"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.498236" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.497956" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.528788" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.498800" elapsed="0.030161"/>
</kw>
<msg time="2026-04-07T17:20:44.529148" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.529194" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.498418" elapsed="0.030811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.591936" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.529781" elapsed="0.062651"/>
</kw>
<msg time="2026-04-07T17:20:44.592834" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.592937" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.529395" elapsed="0.063674"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.593835" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.593298" elapsed="0.000736"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.593237" elapsed="0.000858"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.595300" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.594408" elapsed="0.001154"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.596234" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.595721" elapsed="0.000682"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.595680" elapsed="0.000777"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.596532" elapsed="0.000067"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.601091" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:20:44.602577" elapsed="0.000986"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.605745" elapsed="0.000787"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.598530" elapsed="0.008158"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.597168" elapsed="0.009781"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.496579" elapsed="0.110640"/>
</kw>
<msg time="2026-04-07T17:20:44.607426" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.607569" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.495947" elapsed="0.111705"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.608481" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.607825" elapsed="0.000794"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.607783" elapsed="0.000890"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.609598" elapsed="0.000059"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.610382" elapsed="0.000054"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.610541" elapsed="0.000036"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.495269" elapsed="0.115598"/>
</kw>
<msg time="2026-04-07T17:20:44.611147" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.611249" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.490535" elapsed="0.120791"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.612161" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.611546" elapsed="0.000674"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.611459" elapsed="0.000786"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:44.490398" elapsed="0.121871"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.619439" elapsed="0.000030"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.619327" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.619308" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.620742" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.620634" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.620616" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.621342" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.620949" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.621786" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.621526" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.650181" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.622387" elapsed="0.027956"/>
</kw>
<msg time="2026-04-07T17:20:44.650512" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.650560" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.621984" elapsed="0.028612"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.709361" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.651185" elapsed="0.058369"/>
</kw>
<msg time="2026-04-07T17:20:44.709736" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.709783" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.650771" elapsed="0.059047"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.710144" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.709895" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.709874" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.710768" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.710384" elapsed="0.000469"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.711150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.710919" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.710901" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.711301" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.713638" elapsed="0.000533"/>
</kw>
<kw name="Open 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-07T17:20:44.715176" elapsed="0.000529"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.716647" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.712156" elapsed="0.004903"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.711554" elapsed="0.005652"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.620330" elapsed="0.096978"/>
</kw>
<msg time="2026-04-07T17:20:44.717398" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.717442" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.619671" elapsed="0.097810"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.717683" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.717565" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.717545" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.718162" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.718487" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.718556" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.618956" elapsed="0.099721"/>
</kw>
<msg time="2026-04-07T17:20:44.718770" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.718813" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.612542" elapsed="0.106306"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.719186" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.718923" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.718905" elapsed="0.000379"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:44.612403" elapsed="0.106905"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:44.366239" elapsed="0.353098"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:44.363789" elapsed="0.355606"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:44.359235" elapsed="0.360214"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.358798" elapsed="0.360697"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:44.356104" elapsed="0.363442"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:44.731597" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.727527" elapsed="0.004120">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.355469" elapsed="0.376328">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t39" name="Create Port In Old Owner and Verify After Recover" line="186">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:44.735174" elapsed="0.000233"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:44.734894" 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-07T17:20:44.736449" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.736338" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.736320" 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-07T17:20:44.741144" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.741036" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.741018" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.742260" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:44.741847" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.742764" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:44.742443" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:44.742834" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:44.743004" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:44.741426" elapsed="0.001604"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.748285" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.748177" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.748157" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.749576" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.749467" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.749449" elapsed="0.000201"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.750168" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.749791" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.750607" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.750349" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.778392" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.751220" elapsed="0.027327"/>
</kw>
<msg time="2026-04-07T17:20:44.778732" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.778777" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.750792" elapsed="0.028019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.836801" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.779410" elapsed="0.057602"/>
</kw>
<msg time="2026-04-07T17:20:44.837185" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.837231" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.778991" elapsed="0.058279"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.837579" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.837350" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.837330" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.838217" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.837817" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.838593" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.838366" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.838348" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.838727" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.841132" elapsed="0.000556"/>
</kw>
<kw name="Open 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-07T17:20:44.842631" elapsed="0.000501"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.844098" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.839628" elapsed="0.004866"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.839006" elapsed="0.005612"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.749166" elapsed="0.095552"/>
</kw>
<msg time="2026-04-07T17:20:44.844808" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.844851" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.748499" elapsed="0.096387"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.845089" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.844978" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.844945" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.845568" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.845896" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.845997" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.747820" elapsed="0.098289"/>
</kw>
<msg time="2026-04-07T17:20:44.846202" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.846245" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.743420" elapsed="0.102860"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.846612" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.846353" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.846337" elapsed="0.000356"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:44.743282" elapsed="0.103434"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.852168" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.851923" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.851905" elapsed="0.000332"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.853462" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.853355" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.853337" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.854144" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.853672" elapsed="0.000499"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.854577" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.854324" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.885124" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.855205" elapsed="0.030105"/>
</kw>
<msg time="2026-04-07T17:20:44.885478" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.885524" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.854780" elapsed="0.030778"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.945743" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.886219" elapsed="0.059720"/>
</kw>
<msg time="2026-04-07T17:20:44.946166" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:44.946214" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.885725" elapsed="0.060525"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.946553" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.946329" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.946309" elapsed="0.000344"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:44.947222" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:44.946805" elapsed="0.000501"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.947588" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.947375" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.947356" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:44.947719" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:44.950019" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:20:44.951495" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:44.952899" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:44.948562" elapsed="0.004746"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:44.947987" elapsed="0.005434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.853042" elapsed="0.100479"/>
</kw>
<msg time="2026-04-07T17:20:44.953613" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.953658" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.852384" elapsed="0.101311"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:44.953878" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:44.953771" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.953753" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.954363" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.954687" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.954770" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.851572" elapsed="0.103306"/>
</kw>
<msg time="2026-04-07T17:20:44.954998" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:44.955045" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.847012" elapsed="0.108068"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:44.955411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:44.955166" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.955140" elapsed="0.000348"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:44.846837" elapsed="0.108674"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.960911" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.960802" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.960783" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:44.962223" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:44.962083" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:44.962065" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:44.962816" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:44.962433" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.963272" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:44.963014" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:44.990773" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:44.963836" elapsed="0.027097"/>
</kw>
<msg time="2026-04-07T17:20:44.991124" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:44.991171" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.963456" elapsed="0.027750"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.055013" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:44.991767" elapsed="0.063449"/>
</kw>
<msg time="2026-04-07T17:20:45.055387" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.055433" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.991380" elapsed="0.064089"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.055778" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.055553" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.055526" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.056425" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.056048" elapsed="0.000460"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.056785" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.056576" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.056558" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.056916" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.059250" elapsed="0.000511"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.060694" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.062110" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.057757" elapsed="0.004748"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.057183" elapsed="0.005461"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:44.961756" elapsed="0.100988"/>
</kw>
<msg time="2026-04-07T17:20:45.062836" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.062882" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.961141" elapsed="0.101777"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.063118" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.063012" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.062992" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.063582" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.063956" elapsed="0.000039"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.064043" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:44.960461" elapsed="0.103691"/>
</kw>
<msg time="2026-04-07T17:20:45.064245" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.064289" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.955763" elapsed="0.108561"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.064643" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.064399" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.064382" elapsed="0.000339"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:44.955630" elapsed="0.109114"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:44.743085" elapsed="0.321689"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:44.740661" elapsed="0.324167"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:44.736053" elapsed="0.328830"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:44.735617" elapsed="0.329311"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:44.732804" elapsed="0.332194"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:45.076767" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.072831" elapsed="0.003973">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:44.732161" elapsed="0.344782">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t40" name="Modify the destination IP of Port In Old Owner After Recover" line="190">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:45.080136" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:45.079862" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.081373" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.081264" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.081246" 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-07T17:20:45.085991" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.085871" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.085852" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.087082" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:45.086686" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.087566" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:45.087264" elapsed="0.000328"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:45.087636" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:45.087790" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:45.086286" elapsed="0.001529"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.093070" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.092946" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.092927" elapsed="0.000213"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.094330" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.094223" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.094205" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.094919" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.094566" elapsed="0.000431"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.095412" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.095157" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.124246" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.095991" elapsed="0.028414"/>
</kw>
<msg time="2026-04-07T17:20:45.124577" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.124623" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.095593" elapsed="0.029066"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.193901" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.125239" elapsed="0.068923"/>
</kw>
<msg time="2026-04-07T17:20:45.194378" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.194424" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.124824" elapsed="0.069635"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.194769" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.194542" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.194517" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.195437" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.195047" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.195800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.195590" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.195572" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.195931" elapsed="0.000050"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.198285" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:20:45.199741" elapsed="0.000502"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.201171" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.196791" elapsed="0.004774"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.196215" elapsed="0.005465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.093902" elapsed="0.107878"/>
</kw>
<msg time="2026-04-07T17:20:45.201870" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.201914" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.093287" elapsed="0.108663"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.202149" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.202043" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.202024" elapsed="0.000235"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.202653" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.203014" elapsed="0.000060"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.203125" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.092603" elapsed="0.110631"/>
</kw>
<msg time="2026-04-07T17:20:45.203334" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.203378" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.088196" elapsed="0.115218"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.203751" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.203489" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.203472" elapsed="0.000358"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:45.088051" elapsed="0.115803"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.209514" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.209406" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.209387" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.210796" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.210689" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.210672" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.211390" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.211030" elapsed="0.000387"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.211823" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.211571" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.247285" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.212403" elapsed="0.035043"/>
</kw>
<msg time="2026-04-07T17:20:45.247615" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.247661" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.212021" elapsed="0.035675"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.321199" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.248272" elapsed="0.073148"/>
</kw>
<msg time="2026-04-07T17:20:45.321608" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.321656" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.247864" elapsed="0.073826"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.322052" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.321776" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.321755" elapsed="0.000401"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.322670" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.322296" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.323056" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.322825" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.322807" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.323194" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.325556" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:20:45.327021" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.328418" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.324109" elapsed="0.004703"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.323453" elapsed="0.005474"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.210389" elapsed="0.118656"/>
</kw>
<msg time="2026-04-07T17:20:45.329143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.329187" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.209729" elapsed="0.119494"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.329407" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.329300" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.329282" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.329873" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.330240" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.330313" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.208840" elapsed="0.121581"/>
</kw>
<msg time="2026-04-07T17:20:45.330513" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.330557" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.204235" elapsed="0.126357"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.330912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.330665" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.330649" elapsed="0.000357"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:45.204096" elapsed="0.126934"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.336294" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.336186" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.336168" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.337580" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.337474" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.337456" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.338328" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.337785" elapsed="0.000570"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.338760" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.338509" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.368776" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.339339" elapsed="0.029820"/>
</kw>
<msg time="2026-04-07T17:20:45.369533" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.369634" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.338939" elapsed="0.030771"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.439432" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.371021" elapsed="0.068899"/>
</kw>
<msg time="2026-04-07T17:20:45.440246" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.440311" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.370148" elapsed="0.070214"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.440907" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.440513" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.440465" elapsed="0.000619"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.441907" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "i "o "n "[C "[78CI "[A[78CP
 "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.441284" elapsed="0.000793"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.442482" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.442180" elapsed="0.000410"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.442153" elapsed="0.000472"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.442675" elapsed="0.000047"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.446102" elapsed="0.000712"/>
</kw>
<kw name="Open 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-07T17:20:45.448133" elapsed="0.000689"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.450176" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.443965" elapsed="0.006629"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.443116" elapsed="0.007596"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.337173" elapsed="0.113645"/>
</kw>
<msg time="2026-04-07T17:20:45.450916" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.450962" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.336508" elapsed="0.114508"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.451207" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.451099" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.451079" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.451706" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.452069" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.452145" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.335800" elapsed="0.116459"/>
</kw>
<msg time="2026-04-07T17:20:45.452359" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.452403" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.331287" elapsed="0.121154"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.452774" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.452522" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.452504" elapsed="0.000349"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:45.331151" elapsed="0.121726"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:45.087868" elapsed="0.365046"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:45.085510" elapsed="0.367487"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:45.080976" elapsed="0.372126"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.080547" elapsed="0.372609"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:45.077882" elapsed="0.375334"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:45.461687" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.457796" elapsed="0.003954">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.077320" elapsed="0.384595">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t41" name="Verify Port Is Modified After Recover" 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-07T17:20:45.465772" elapsed="0.000226"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:45.465498" elapsed="0.000555"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.467040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.466914" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.466896" 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-07T17:20:45.471753" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.471645" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.471628" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.472836" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:45.472439" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.473343" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:45.473036" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:45.473412" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:45.473565" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:45.472064" elapsed="0.001525"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.478959" elapsed="0.000031"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.478852" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.478833" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.480248" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.480141" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.480122" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.480814" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.480454" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.481266" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.481009" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.511147" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.481835" elapsed="0.029489"/>
</kw>
<msg time="2026-04-07T17:20:45.511494" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.511539" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.481443" elapsed="0.030130"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.576356" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.512145" elapsed="0.064414"/>
</kw>
<msg time="2026-04-07T17:20:45.576741" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.576839" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.511738" elapsed="0.065138"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.577203" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.576961" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.576940" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.577831" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.577449" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.578205" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.577992" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.577957" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.578337" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.580881" elapsed="0.000774"/>
</kw>
<kw name="Open 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-07T17:20:45.582964" elapsed="0.000692"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.584941" elapsed="0.000465"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.579184" elapsed="0.006350"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.578595" elapsed="0.007114"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.479806" elapsed="0.106045"/>
</kw>
<msg time="2026-04-07T17:20:45.586018" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.586082" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.479195" elapsed="0.106936"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.586320" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.586214" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.586195" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.586788" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.587143" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.587215" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.478517" elapsed="0.108805"/>
</kw>
<msg time="2026-04-07T17:20:45.587414" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.587456" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.474029" elapsed="0.113462"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.587811" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.587566" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.587548" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:45.473861" elapsed="0.114049"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.594935" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.594801" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.594780" elapsed="0.000252"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.596424" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.596299" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.596279" elapsed="0.000265"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.597160" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.596711" elapsed="0.000479"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.597687" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.597367" elapsed="0.000349"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.629709" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.598347" elapsed="0.031522"/>
</kw>
<msg time="2026-04-07T17:20:45.630080" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.630128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.597899" elapsed="0.032264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.689018" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.630717" elapsed="0.058485"/>
</kw>
<msg time="2026-04-07T17:20:45.689381" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.689427" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.630331" elapsed="0.059130"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.689754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.689539" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.689519" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.690388" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.690014" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.690742" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.690534" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.690516" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.690873" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.693192" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:20:45.694771" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.696172" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.691726" elapsed="0.004832"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.691155" elapsed="0.005516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.595923" elapsed="0.100848"/>
</kw>
<msg time="2026-04-07T17:20:45.696861" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.696905" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.595210" elapsed="0.101730"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.697146" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.697035" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.697015" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.697635" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.698021" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.698094" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.594225" elapsed="0.103976"/>
</kw>
<msg time="2026-04-07T17:20:45.698294" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.698337" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.588185" elapsed="0.110186"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.698689" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.698446" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.698429" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:45.588048" elapsed="0.110741"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.705741" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.705633" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.705614" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.707023" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.706894" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.706876" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:45.707580" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.707228" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.708026" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:45.707759" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.735736" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:45.708584" elapsed="0.027322"/>
</kw>
<msg time="2026-04-07T17:20:45.736089" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:45.736134" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.708207" elapsed="0.027962"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:45.786294" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:45.736718" elapsed="0.049763"/>
</kw>
<msg time="2026-04-07T17:20:45.786649" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:45.786694" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.736335" elapsed="0.050393"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.787051" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.786805" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.786785" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.787654" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "f "i "e "d "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.787290" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.788026" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.787797" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.787779" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:45.788161" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:45.790489" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:20:45.791904" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:45.793311" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.789063" elapsed="0.004685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:45.788414" elapsed="0.005448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:45.706592" elapsed="0.087371"/>
</kw>
<msg time="2026-04-07T17:20:45.794081" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.794128" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.705956" elapsed="0.088209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:45.794349" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:45.794243" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.794224" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.794808" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.795149" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.795220" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:45.705289" elapsed="0.090038"/>
</kw>
<msg time="2026-04-07T17:20:45.795418" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:45.795461" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.699083" elapsed="0.096413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.795810" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.795569" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:45.795552" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:45.698913" elapsed="0.096997"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:45.473647" elapsed="0.322293"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:45.471283" elapsed="0.324729"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:45.466620" elapsed="0.329448"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:45.466200" elapsed="0.329912"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:45.463077" elapsed="0.333085"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.802761" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:45.802407" elapsed="0.000381"/>
</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-07T17:20:45.812487" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:45.812102" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.812984" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:45.812669" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:45.813065" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:45.813225" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:45.811723" elapsed="0.001526"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.818758" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:45.818463" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:45.818829" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:45.818987" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:45.818123" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.825180" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.824898" elapsed="0.000328"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:45.825614" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:45.825374" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:45.840926" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:45.841126" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:45.841238" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.827752" elapsed="0.013922">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:45.825725" elapsed="0.016036">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.841944" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:45.841794" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:45.825706" elapsed="0.016343">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.842416" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.842548" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:45.842512" elapsed="0.000076"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:45.842496" elapsed="0.000113"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:45.842747" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.842814" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.819337" elapsed="0.023585">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:45.842996" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:20:45.817624" elapsed="0.025466">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:45.843317" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:45.813496" elapsed="0.029898">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:45.813352" elapsed="0.030132">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.811082" elapsed="0.032494">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:46.860237" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:46.859791" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:46.860740" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:46.860432" elapsed="0.000334"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:46.860812" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:20:46.860986" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:46.859411" elapsed="0.001603"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:46.866278" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:46.865978" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:46.866351" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:46.866498" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:46.865628" elapsed="0.000895"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:46.872863" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:46.872612" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:46.873318" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:46.873074" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:46.882084" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:46.882223" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:46.882325" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:46.875374" elapsed="0.007323">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:46.873445" elapsed="0.009331">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:46.882960" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:46.882810" elapsed="0.000231"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:46.873426" elapsed="0.009639">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:46.883446" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:46.883631" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:46.883593" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:46.883574" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:46.883836" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:46.883906" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:46.866854" elapsed="0.017174">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:46.884090" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:20:46.865148" elapsed="0.019041">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:46.884417" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:46.861210" elapsed="0.023285">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:46.861069" elapsed="0.023483">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:46.858672" elapsed="0.025972">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:47.899616" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:47.899220" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:47.900122" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:47.899800" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:47.900194" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:47.900355" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:47.898828" elapsed="0.001552"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:47.905825" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:47.905457" elapsed="0.000396"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:47.905900" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:47.906069" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:47.905116" elapsed="0.000978"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:47.912607" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:47.912338" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:47.913068" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:47.912807" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:47.922353" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:47.922480" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:47.922623" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:47.915106" elapsed="0.007894">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:47.913184" elapsed="0.009899">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:47.923266" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:47.923116" elapsed="0.000214"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:47.913165" elapsed="0.010188">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:47.923709" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:47.923840" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:47.923804" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:47.923788" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:47.924057" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:47.924127" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:47.906417" elapsed="0.017819">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:47.924296" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:20:47.904613" elapsed="0.019775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:47.924617" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:47.900565" elapsed="0.024129">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:47.900432" elapsed="0.024318">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:47.898163" elapsed="0.026677">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:48.942872" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:48.942473" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:48.943382" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:48.943075" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:48.943453" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:48.943608" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:48.942096" elapsed="0.001537"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:48.948882" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:48.948586" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:48.949011" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:48.949163" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:48.948246" elapsed="0.000942"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:48.955473" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:48.955224" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:48.955911" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:48.955670" elapsed="0.000313"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:48.964273" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:48.964435" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:48.964566" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:48.957941" elapsed="0.007107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:48.956053" elapsed="0.009107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:48.965416" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:48.965206" elapsed="0.000301"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:48.956034" elapsed="0.009505">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:48.966056" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:48.966242" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:48.966192" elapsed="0.000107"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:48.966168" elapsed="0.000161"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:48.966520" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:48.966613" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:48.949514" elapsed="0.017242">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:48.966839" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:20:48.947739" elapsed="0.019247">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:48.967304" elapsed="0.000033"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:48.943819" elapsed="0.023592">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:48.943686" elapsed="0.023803">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:48.941398" elapsed="0.026263">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:49.986152" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:49.985687" elapsed="0.000496"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:49.986683" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:49.986352" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:49.986765" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:20:49.986941" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:49.985300" elapsed="0.001692"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:49.992399" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:49.992102" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:49.992471" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:49.992616" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:49.991746" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:49.999007" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:49.998737" elapsed="0.000318"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:49.999447" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:49.999205" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:50.008069" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:50.008208" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:50.008309" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:50.001461" elapsed="0.007227">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:49.999563" elapsed="0.009208">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:50.008955" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:50.008805" elapsed="0.000232"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:49.999542" elapsed="0.009519">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:50.009434" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:50.009565" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:50.009529" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:50.009513" 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>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:50.009842" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:50.009914" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:49.992989" elapsed="0.017044">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:50.010096" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:20:49.991249" elapsed="0.018939">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:50.010417" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:49.987205" elapsed="0.023290">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:49.987057" elapsed="0.023513">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:49.984530" elapsed="0.026134">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:20:51.028904" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:51.028504" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.029424" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:51.029106" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:51.029496" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:20:51.029651" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:51.028131" elapsed="0.001545"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.035270" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:51.034928" elapsed="0.000370"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:51.035346" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:51.035492" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.034587" elapsed="0.000930"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.041813" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.041564" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.042270" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.042026" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:51.050794" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:51.050916" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:20:51.051075" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.044275" elapsed="0.007150">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:20:51.042382" elapsed="0.009122">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.051687" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.051537" elapsed="0.000215"/>
</branch>
<status status="FAIL" start="2026-04-07T17:20:51.042363" elapsed="0.009415">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.052155" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.052288" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.052252" elapsed="0.000084"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:51.052235" elapsed="0.000122"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.052493" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.052562" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.035844" elapsed="0.016820">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.052726" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:20:51.034083" elapsed="0.018734">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:20:51.053057" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:20:51.029868" elapsed="0.023265">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:20:51.029728" elapsed="0.023463">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.027438" elapsed="0.025861">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:20:51.053402" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:20:45.802987" elapsed="5.250509">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.800387" elapsed="5.253222">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:45.462438" elapsed="5.591326">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Ff72038e3-f28b-4edd-aba9-2c02ed31546c%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s1-t42" name="Delete Port In Old Owner After Recover" 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-07T17:20:51.056925" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:51.056661" 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-07T17:20:51.058224" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.058113" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.058094" 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-07T17:20:51.064846" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.064697" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.064672" elapsed="0.000269"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.066351" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:51.065802" elapsed="0.000586"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.067052" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:51.066604" elapsed="0.000484"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:51.067152" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:20:51.067367" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:51.065281" elapsed="0.002120"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.073375" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.073265" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.073238" elapsed="0.000204"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.074654" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.074548" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.074530" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.075241" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.074860" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.075685" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.075428" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.107472" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.076258" elapsed="0.031381"/>
</kw>
<msg time="2026-04-07T17:20:51.107812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.107858" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.075863" elapsed="0.032030"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.160446" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.108467" elapsed="0.052175"/>
</kw>
<msg time="2026-04-07T17:20:51.160810" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.160855" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.108076" elapsed="0.052813"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.161226" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.160992" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.160947" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.161833" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.161465" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.162249" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.162037" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.162018" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.162382" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.164711" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.166188" elapsed="0.000618"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.167738" elapsed="0.000344"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.163246" elapsed="0.004909"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.162647" elapsed="0.005621"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.074248" elapsed="0.094120"/>
</kw>
<msg time="2026-04-07T17:20:51.168458" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.168501" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.073585" elapsed="0.094951"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.168720" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.168613" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.168594" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.169234" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.169566" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.169637" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.072903" elapsed="0.096840"/>
</kw>
<msg time="2026-04-07T17:20:51.169833" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.169877" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.067894" elapsed="0.102018"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.170248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.170001" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.169983" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:51.067702" elapsed="0.102647"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.175373" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.175264" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.175245" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.176626" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.176518" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.176500" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.177452" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.176830" elapsed="0.000649"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.177883" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.177633" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.207505" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.178455" elapsed="0.029544"/>
</kw>
<msg time="2026-04-07T17:20:51.208703" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.208811" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.178078" elapsed="0.030814"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.257848" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.209997" elapsed="0.048067"/>
</kw>
<msg time="2026-04-07T17:20:51.258236" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.258282" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.209431" elapsed="0.048886"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.258680" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.258418" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.258389" elapsed="0.000397"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.259344" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.258929" elapsed="0.000516"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.259726" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.259513" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.259495" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.259866" elapsed="0.000041"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.262389" elapsed="0.000515"/>
</kw>
<kw name="Open 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-07T17:20:51.263851" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.265280" elapsed="0.000541"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.260837" elapsed="0.005057"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.260212" elapsed="0.005813"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.176212" elapsed="0.089964"/>
</kw>
<msg time="2026-04-07T17:20:51.266269" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.266314" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.175586" elapsed="0.090766"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.266540" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.266432" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.266413" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.267054" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.267393" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.267466" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.174918" elapsed="0.092655"/>
</kw>
<msg time="2026-04-07T17:20:51.267667" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.267710" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.170601" elapsed="0.097144"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.268225" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.267858" elapsed="0.000422"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.267839" elapsed="0.000465"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:51.170467" elapsed="0.097861"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.273627" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.273520" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.273502" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.274864" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.274756" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.274738" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.275461" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.275094" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.275893" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.275640" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.304588" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.276466" elapsed="0.028275"/>
</kw>
<msg time="2026-04-07T17:20:51.304907" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.304991" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.276089" elapsed="0.028939"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.360024" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.305576" elapsed="0.054639"/>
</kw>
<msg time="2026-04-07T17:20:51.360380" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.360425" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.305193" elapsed="0.055267"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.360750" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.360536" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.360517" elapsed="0.000332"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.361386" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "[78Cr "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.361020" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.361738" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.361531" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.361513" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.361870" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.364145" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:20:51.365577" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.366978" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.362695" elapsed="0.004674"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.362135" elapsed="0.005345"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.274459" elapsed="0.093121"/>
</kw>
<msg time="2026-04-07T17:20:51.367737" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.367781" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.273839" elapsed="0.093978"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.368017" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.367893" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.367875" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.368482" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.369013" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.369087" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.273175" elapsed="0.096023"/>
</kw>
<msg time="2026-04-07T17:20:51.369289" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.369332" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.268603" elapsed="0.100764"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.369685" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.369442" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.369425" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:51.268464" elapsed="0.101322"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:51.067472" elapsed="0.302343"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:51.064194" elapsed="0.305684"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:51.057812" elapsed="0.312125"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.057383" elapsed="0.312642"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:51.054651" elapsed="0.315434"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:51.381602" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.377892" elapsed="0.003750">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.054123" elapsed="0.327679">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t43" name="Delete Bridge In Old Owner And Verify After Recover" line="202">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:51.385722" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:51.385465" 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-07T17:20:51.386947" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.386839" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.386821" 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-07T17:20:51.392498" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.392391" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.392374" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.393562" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:51.393184" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.394059" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:51.393744" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:51.394129" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:51.394279" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:51.392786" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.401941" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.401832" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.401814" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.403210" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.403105" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.403087" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.403764" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.403415" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.404210" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.403942" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.435123" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.404765" elapsed="0.030531"/>
</kw>
<msg time="2026-04-07T17:20:51.435464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.435510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.404390" elapsed="0.031154"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.499145" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.436149" elapsed="0.063186"/>
</kw>
<msg time="2026-04-07T17:20:51.499505" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.499549" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.435707" elapsed="0.063877"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.499875" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.499660" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.499640" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.500509" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.500144" elapsed="0.000449"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.500886" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.500659" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.500641" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.501035" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.503303" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:20:51.504739" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.506137" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.501849" elapsed="0.004675"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.501284" elapsed="0.005354"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.402786" elapsed="0.103951"/>
</kw>
<msg time="2026-04-07T17:20:51.506827" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.506870" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.402175" elapsed="0.104730"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.507140" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.507033" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.507013" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.507600" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.507926" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.508014" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.401496" elapsed="0.106626"/>
</kw>
<msg time="2026-04-07T17:20:51.508213" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.508255" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.394711" elapsed="0.113578"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.508604" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.508363" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.508346" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:51.394575" elapsed="0.114129"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.513841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.513734" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.513716" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.515101" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.514994" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.514961" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.515655" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.515307" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.516098" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.515832" elapsed="0.000292"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.547278" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.516655" elapsed="0.030782"/>
</kw>
<msg time="2026-04-07T17:20:51.547605" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.547650" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.516279" elapsed="0.031406"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.619461" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.548310" elapsed="0.071340"/>
</kw>
<msg time="2026-04-07T17:20:51.619815" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.619860" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.547850" elapsed="0.072044"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.620202" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.619985" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.619950" elapsed="0.000360"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.620830" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.620447" elapsed="0.000499"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.621247" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.621035" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.621017" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.621380" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.623641" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:20:51.625095" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.626487" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.622210" elapsed="0.004666"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.621625" elapsed="0.005381"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.514682" elapsed="0.112423"/>
</kw>
<msg time="2026-04-07T17:20:51.627195" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.627239" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.514077" elapsed="0.113197"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.627455" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.627350" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.627332" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.627910" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.628248" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.628319" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.513402" elapsed="0.115022"/>
</kw>
<msg time="2026-04-07T17:20:51.628514" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.628558" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.509000" elapsed="0.119618"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.628935" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.628694" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.628677" elapsed="0.000352"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:51.508848" elapsed="0.120204"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.634485" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.634378" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.634360" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.635723" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.635617" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.635600" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.636293" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.635926" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.636893" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.636471" elapsed="0.000449"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.665481" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.637470" elapsed="0.028173"/>
</kw>
<msg time="2026-04-07T17:20:51.665948" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.666013" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.637091" elapsed="0.028959"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.740474" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.666619" elapsed="0.074049"/>
</kw>
<msg time="2026-04-07T17:20:51.740837" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.740883" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.666222" elapsed="0.074695"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.741248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.741025" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.741001" elapsed="0.000349"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.741856" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "d "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.741490" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.742234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.742025" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.742006" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.742366" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.744648" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:20:51.746095" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.747467" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.743199" elapsed="0.004655"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.742617" elapsed="0.005362"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.635322" elapsed="0.112759"/>
</kw>
<msg time="2026-04-07T17:20:51.748171" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.748215" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.634697" elapsed="0.113553"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.748431" elapsed="0.000051"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.748326" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.748307" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.748919" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.749266" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.749337" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.633815" elapsed="0.115628"/>
</kw>
<msg time="2026-04-07T17:20:51.749533" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.749575" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.629302" elapsed="0.120307"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.749980" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.749720" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.749702" elapsed="0.000357"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:51.629169" elapsed="0.120912"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:51.394400" elapsed="0.355710"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:51.392038" elapsed="0.358126"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:51.386557" elapsed="0.363661"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.386145" elapsed="0.364116"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:51.383030" elapsed="0.367280"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:20:51.762033" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.758082" elapsed="0.003990">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:20:51.382298" elapsed="0.379914">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s1-t44" name="Cleans Up Test Environment For Next Suite" line="206">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:51.765844" elapsed="0.000222"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:51.765589" 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-07T17:20:51.767075" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.766950" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.766932" 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-07T17:20:51.771629" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.771525" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.771507" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.772701" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:51.772293" elapsed="0.000434"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.773202" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:51.772881" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:51.773271" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:51.773425" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:51.771911" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.778636" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.778528" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.778510" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.779884" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.779778" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.779760" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.780479" level="INFO">${karaf_connection_index} = 390</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.780109" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.780908" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.780659" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.811037" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.781489" elapsed="0.029774"/>
</kw>
<msg time="2026-04-07T17:20:51.811474" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.811521" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.781111" elapsed="0.030535"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.872072" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.812399" elapsed="0.059873"/>
</kw>
<msg time="2026-04-07T17:20:51.872471" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.872517" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.811871" elapsed="0.060682"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.872880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.872645" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.872617" elapsed="0.000396"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.873536" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.873159" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.873897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.873685" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.873666" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.874052" elapsed="0.000034"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.876481" elapsed="0.000542"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.877935" elapsed="0.000511"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.879373" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.874948" elapsed="0.004831"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.874343" elapsed="0.005551"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.779479" elapsed="0.100534"/>
</kw>
<msg time="2026-04-07T17:20:51.880113" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.880158" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.778848" elapsed="0.101345"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.880403" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.880272" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.880253" elapsed="0.000234"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.880889" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.881259" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.881332" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.778189" elapsed="0.103257"/>
</kw>
<msg time="2026-04-07T17:20:51.881544" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.881589" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.773805" elapsed="0.107822"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.881951" elapsed="0.000135"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.881705" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.881687" elapsed="0.000505"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:51.773670" elapsed="0.108546"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.887724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.887614" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.887595" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.889022" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.888889" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.888871" elapsed="0.000219"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.889585" level="INFO">${karaf_connection_index} = 392</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.889227" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.890035" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.889763" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.918704" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.890596" elapsed="0.028281"/>
</kw>
<msg time="2026-04-07T17:20:51.919065" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:51.919111" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.890216" elapsed="0.028930"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.976455" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:51.919699" elapsed="0.056944"/>
</kw>
<msg time="2026-04-07T17:20:51.976810" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:51.976856" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.919313" elapsed="0.057578"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.977204" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.976985" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.976947" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:51.977814" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:51.977447" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.978194" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.977962" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.977944" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:51.978324" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:51.980619" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:20:51.982062" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:51.983454" elapsed="0.000318"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:51.979158" elapsed="0.004685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:51.978573" elapsed="0.005382"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.888588" elapsed="0.095482"/>
</kw>
<msg time="2026-04-07T17:20:51.984161" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.984262" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.887938" elapsed="0.096362"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:51.984485" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:51.984378" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.984359" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.984942" elapsed="0.000040"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.985293" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.985363" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.887266" elapsed="0.098204"/>
</kw>
<msg time="2026-04-07T17:20:51.985561" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:51.985604" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.882495" elapsed="0.103144"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:51.985955" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:51.985713" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.985696" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:51.882354" elapsed="0.103716"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.991522" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.991413" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.991394" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:51.992794" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:51.992689" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:51.992672" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:51.993371" level="INFO">${karaf_connection_index} = 394</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:51.993019" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:51.993799" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:51.993548" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.022151" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:51.994372" elapsed="0.027933"/>
</kw>
<msg time="2026-04-07T17:20:52.022472" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:52.022517" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.993993" elapsed="0.028558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.074647" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:52.023126" elapsed="0.051708"/>
</kw>
<msg time="2026-04-07T17:20:52.075021" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:52.075067" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:52.022717" elapsed="0.052385"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:52.075393" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:52.075178" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:52.075158" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:52.076035" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "r "o "n "m "[78Ce "[A[78Cn
 "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:52.075650" elapsed="0.000543"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:52.076476" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:52.076262" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:52.076244" elapsed="0.000333"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:52.076610" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:52.078879" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:20:52.080345" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:52.081716" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:52.077444" elapsed="0.004676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:52.076857" elapsed="0.005379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:51.992385" elapsed="0.089950"/>
</kw>
<msg time="2026-04-07T17:20:52.082426" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:52.082469" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.991736" elapsed="0.090768"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:52.082686" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:52.082581" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:52.082562" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:52.083163" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:52.084280" elapsed="0.000036"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:52.084374" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:51.991076" elapsed="0.093425"/>
</kw>
<msg time="2026-04-07T17:20:52.084605" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:52.084648" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "O "v "s "d "b "[C "S "o "u "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.986326" elapsed="0.098363"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:52.085030" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:52.084764" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:52.084747" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:51.986190" elapsed="0.098940"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:51.773504" elapsed="0.311655"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:51.771169" elapsed="0.314055"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:51.766669" elapsed="0.318617"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:51.766261" elapsed="0.319075"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:51.763315" elapsed="0.322079"/>
</kw>
<kw name="Configure Exit OVSDB Connection" owner="ClusterOvsdb">
<kw name="Clean OVSDB Test Environment" owner="OVSDB">
<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-07T17:20:52.090740" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:52.090476" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:52.090458" elapsed="0.000429"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.091191" 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-07T17:20:52.091292" 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-07T17:20:52.091048" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:52.091838" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:20:52.091463" elapsed="0.000420"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.092506" level="INFO">${conn_id} = 581</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-07T17:20:52.092133" elapsed="0.000399"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:52.093452" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:52.093528" 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-07T17:20:52.093149" elapsed="0.000403"/>
</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-07T17:20:52.093705" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.094870" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:52.459702" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:33 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:52.094553" elapsed="0.365247"/>
</kw>
<msg time="2026-04-07T17:20:52.459862" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:52.094202" elapsed="0.365719"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:52.092744" elapsed="0.367282"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:52.460394" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:20:53.649189" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:53.649477" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:53.649578" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:52.460207" elapsed="1.189425"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:53.650114" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:53.651733" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:53.651115" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:53.652344" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:53.652056" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:53.652001" elapsed="0.000503"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:53.652854" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:20:53.652622" elapsed="0.000395"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:53.652588" elapsed="0.000485"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:53.653152" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:53.659295" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:53.659984" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:53.660288" elapsed="0.000337"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:53.653950" elapsed="0.006730"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:52.089940" elapsed="1.570831"/>
</kw>
<msg time="2026-04-07T17:20:53.660826" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:52.089374" elapsed="1.571506"/>
</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="PASS" start="2026-04-07T17:20:52.088875" elapsed="1.572086"/>
</kw>
<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-07T17:20:53.663070" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:53.662781" elapsed="0.000347"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:53.662762" elapsed="0.000390"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:53.663441" 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-07T17:20:53.663546" 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-07T17:20:53.663299" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:53.664112" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:20:53.663718" elapsed="0.000441"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:53.664673" level="INFO">${conn_id} = 583</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-07T17:20:53.664309" elapsed="0.000389"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:53.665591" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:53.665667" 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-07T17:20:53.665310" elapsed="0.000380"/>
</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-07T17:20:53.665842" elapsed="0.000330"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:53.667031" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:54.042107" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:52 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:53.666700" elapsed="0.375513"/>
</kw>
<msg time="2026-04-07T17:20:54.042281" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:53.666332" elapsed="0.376014"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:53.664907" elapsed="0.377537"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.042832" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:20:54.079366" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:20:54.079868" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:54.080005" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:54.042634" elapsed="0.037430"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.080535" elapsed="0.000545"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.082197" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:54.081495" elapsed="0.000795"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.082768" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:54.082470" elapsed="0.000407"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.082416" elapsed="0.000513"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:54.083313" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:20:54.083081" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.083046" elapsed="0.000457"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.083579" elapsed="0.000030"/>
</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-07T17:20:54.089532" elapsed="0.000782"/>
</kw>
<kw name="Open 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-07T17:20:54.090521" elapsed="0.000169"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.090834" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:54.084311" elapsed="0.006689"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:53.662239" elapsed="0.428859"/>
</kw>
<msg time="2026-04-07T17:20:54.091156" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:53.661658" elapsed="0.429557"/>
</kw>
<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="PASS" start="2026-04-07T17:20:53.661157" elapsed="0.430142"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:20:52.088532" elapsed="2.002827"/>
</kw>
<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-07T17:20:54.093497" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:54.093218" elapsed="0.000337"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.093198" elapsed="0.000381"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.093873" 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-07T17:20:54.093992" 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-07T17:20:54.093728" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.094565" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.56" 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-07T17:20:54.094180" elapsed="0.000431"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.095145" level="INFO">${conn_id} = 585</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-07T17:20:54.094761" elapsed="0.000409"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.096066" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:54.096143" 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-07T17:20:54.095772" elapsed="0.000395"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.096320" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.097508" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:54.412478" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:53 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:54.097191" elapsed="0.315525"/>
</kw>
<msg time="2026-04-07T17:20:54.412800" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.096824" elapsed="0.316057"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:54.095380" elapsed="0.317635"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.413578" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-04-07T17:20:54.435807" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:54.436121" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:54.436228" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:54.413282" elapsed="0.022999"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.436662" elapsed="0.000494"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.438305" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:54.437573" elapsed="0.000832"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.438785" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:54.438587" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.438546" elapsed="0.000342"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:54.439138" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:20:54.438984" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.438943" elapsed="0.000314"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.439305" elapsed="0.000020"/>
</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-07T17:20:54.443116" elapsed="0.000475"/>
</kw>
<kw name="Open 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-07T17:20:54.443821" elapsed="0.000249"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.444277" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:54.439755" elapsed="0.004728"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:54.092672" elapsed="0.351936"/>
</kw>
<msg time="2026-04-07T17:20:54.444681" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.092095" elapsed="0.352654"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl del-manager</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:54.091574" elapsed="0.353288"/>
</kw>
<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-07T17:20:54.447778" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:54.447410" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.447383" elapsed="0.000509"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.448308" 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-07T17:20:54.448464" 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-07T17:20:54.448114" elapsed="0.000388"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.449258" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.56" 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-07T17:20:54.448706" elapsed="0.000616"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.450099" level="INFO">${conn_id} = 587</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-07T17:20:54.449531" elapsed="0.000604"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.451210" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:54.451286" 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-07T17:20:54.450903" elapsed="0.000405"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.451509" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.452712" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:54.771661" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:54 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:54.452394" elapsed="0.319357"/>
</kw>
<msg time="2026-04-07T17:20:54.771811" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.452023" elapsed="0.319845"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:54.450440" elapsed="0.321516"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.772346" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-04-07T17:20:54.865127" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:54.865386" level="INFO">${stdout} =  * Exiting ovs-vswitchd (5778)
 * Exiting ovsdb-server (5761)</msg>
<msg time="2026-04-07T17:20:54.865485" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:54.772157" elapsed="0.093378"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.865883" elapsed="0.000451"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.867301" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:54.866702" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.867804" elapsed="0.000033"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:54.867548" elapsed="0.000354"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.867503" elapsed="0.000448"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:54.868329" elapsed="0.000055"/>
</return>
<status status="PASS" start="2026-04-07T17:20:54.868101" elapsed="0.000353"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.868067" elapsed="0.000439"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:54.868578" elapsed="0.000030"/>
</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-07T17:20:54.874311" elapsed="0.000384"/>
</kw>
<kw name="Open 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-07T17:20:54.874854" elapsed="0.000166"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:54.875164" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:54.869258" elapsed="0.006052"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:54.446661" elapsed="0.428736"/>
</kw>
<msg time="2026-04-07T17:20:54.875449" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.445863" elapsed="0.429633"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl stop</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:54.445157" elapsed="0.430416"/>
</kw>
<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-07T17:20:54.877626" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:54.877362" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:54.877343" elapsed="0.000363"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.877994" 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-07T17:20:54.878098" 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-07T17:20:54.877849" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.878700" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.56" 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-07T17:20:54.878316" elapsed="0.000429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.879270" level="INFO">${conn_id} = 589</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-07T17:20:54.878895" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:54.880187" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:54.880262" 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-07T17:20:54.879894" elapsed="0.000391"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.880437" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:54.881600" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:55.213495" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:54 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:54.881276" elapsed="0.332310"/>
</kw>
<msg time="2026-04-07T17:20:55.213648" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.880914" elapsed="0.332790"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:54.879505" elapsed="0.334286"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.214182" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-04-07T17:20:55.226186" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:55.226424" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:55.226519" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:55.213984" elapsed="0.012585"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:55.226919" elapsed="0.000482"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.228390" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.227778" elapsed="0.000704"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.228902" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:55.228641" elapsed="0.000420"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.228596" elapsed="0.000521"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:55.229476" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:20:55.229239" elapsed="0.000367"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.229203" elapsed="0.000458"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.229736" elapsed="0.000030"/>
</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-07T17:20:55.235540" elapsed="0.000931"/>
</kw>
<kw name="Open 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-07T17:20:55.236830" elapsed="0.000417"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:55.237598" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.230459" elapsed="0.007327"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:54.876813" elapsed="0.361064"/>
</kw>
<msg time="2026-04-07T17:20:55.237930" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:54.876268" elapsed="0.361724"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo rm -rf /etc/openvswitch/conf.db</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:54.875763" elapsed="0.362373"/>
</kw>
<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-07T17:20:55.240183" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.239904" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.239886" elapsed="0.000377"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.240538" 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-07T17:20:55.240638" 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-07T17:20:55.240407" elapsed="0.000256"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.241339" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.56" 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-07T17:20:55.240809" elapsed="0.000577"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.241903" level="INFO">${conn_id} = 591</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-07T17:20:55.241541" elapsed="0.000387"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.242833" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:55.242908" 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-07T17:20:55.242567" elapsed="0.000364"/>
</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-07T17:20:55.243099" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.244444" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:55.604252" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:20:00 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:55 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:55.243923" elapsed="0.360421"/>
</kw>
<msg time="2026-04-07T17:20:55.604406" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.243578" elapsed="0.360885"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:55.242174" elapsed="0.362374"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.604946" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-04-07T17:20:55.708371" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:20:55.708635" level="INFO">${stdout} =  * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * system ID not configured, please use --system-id
 * Configuring Open vSwitch ...</msg>
<msg time="2026-04-07T17:20:55.708737" level="INFO">${stderr} = 2026-04-07T17:20:55Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:20:55Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:20:55Z|00001|dns_res...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:55.604755" elapsed="0.104036"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:55.709187" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.710612" level="INFO">2026-04-07T17:20:55Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:20:55Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:20:55Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.710033" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.711172" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:55.710872" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.710826" elapsed="0.000504"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:55.711678" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:20:55.711448" elapsed="0.000358"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.711414" elapsed="0.000527"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.712058" elapsed="0.000034"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.717748" elapsed="0.000335"/>
</kw>
<kw name="Open 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-07T17:20:55.718244" elapsed="0.000153"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:55.718544" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.712747" elapsed="0.005946"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:55.239381" elapsed="0.479402"/>
</kw>
<msg time="2026-04-07T17:20:55.718838" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.238819" elapsed="0.480067"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl start</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:20:55.238330" elapsed="0.480634"/>
</kw>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>General Use Keyword attempting to sanitize test environment for OVSDB related
tests. Not every step will always be neccessary, but should not cause any problems for
any new ovsdb test suites.</doc>
<status status="PASS" start="2026-04-07T17:20:52.087931" elapsed="3.631106"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.719537" level="INFO">${dictionary} = {'ovsdb://uuid': '0'}</msg>
<var>${dictionary}</var>
<arg>ovsdb://uuid=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.719215" elapsed="0.000347"/>
</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-07T17:20:55.725502" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:55.725120" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.726007" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:55.725688" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:55.726077" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.726229" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:55.724737" elapsed="0.001516"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.731822" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.731468" elapsed="0.000382"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.731897" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:55.732063" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.731125" elapsed="0.000963"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.738212" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.737952" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.738644" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.738406" elapsed="0.000279"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.747215" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node015jpg9i9xtvyy1np86tadmz3k682.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:55.747371" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:55.747484" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:55.740677" elapsed="0.006838"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.738751" elapsed="0.008817"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.747746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.747596" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.738733" elapsed="0.009136"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.751143" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.748908" elapsed="0.002281"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.748686" elapsed="0.002537"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.748668" elapsed="0.002580"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.753735" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.751518" elapsed="0.002280"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.751303" elapsed="0.002543"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.751286" elapsed="0.002593"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.754856" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.754310" elapsed="0.000583"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.755333" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.755014" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.756094" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.755658" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.755446" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.754986" elapsed="0.001223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.756940" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.756420" elapsed="0.000580"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.757425" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.757099" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.758182" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.757749" elapsed="0.000468"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.757536" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.757074" elapsed="0.001222"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.758497" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:55.759628" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.759226" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.759869" elapsed="0.003205"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:55.748242" elapsed="0.014920"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:55.763405" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:20:55.763258" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.763232" elapsed="0.000291"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.763719" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.763817" elapsed="0.000020"/>
</return>
<msg time="2026-04-07T17:20:55.766520" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:55.732416" elapsed="0.034131"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:55.766597" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:55.766744" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:55.730623" elapsed="0.036146"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.767933" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:55.767553" elapsed="0.000462"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:20:55.767402" elapsed="0.000688"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:55.767271" elapsed="0.000855"/>
</for>
<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="PASS" start="2026-04-07T17:20:55.767008" elapsed="0.001181"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:55.726466" elapsed="0.041757"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.773485" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.773188" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.773556" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.773700" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.772834" elapsed="0.000890"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.779848" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.779602" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.780297" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.780055" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.797905" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0p0clga01de7cx48evkvd6p5g2.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:55.798074" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:55.798209" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:55.782333" elapsed="0.015912"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.780421" elapsed="0.017883"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.798570" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.798340" elapsed="0.000385"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.780401" elapsed="0.018370"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.806386" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.801062" elapsed="0.005427"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.800545" elapsed="0.006020"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.800479" elapsed="0.006141"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.810747" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.807257" elapsed="0.003535"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.806741" elapsed="0.004085"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.806704" elapsed="0.004147"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.811388" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.811018" elapsed="0.000396"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.811712" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.811484" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.812258" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.811945" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.811793" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.811465" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.812869" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.812497" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.813207" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.812964" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.813734" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.813441" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.813289" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.812945" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.814017" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:55.814800" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.814528" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.814989" elapsed="0.002119"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:55.799559" elapsed="0.017612"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:55.817346" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:55.817240" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.817221" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.817570" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.817639" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:55.819770" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:55.774056" elapsed="0.045742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:55.819848" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.820011" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:55.772325" elapsed="0.047713"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.821203" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:55.820820" elapsed="0.000447"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:20:55.820672" elapsed="0.000634"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:55.820540" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:20:55.820258" elapsed="0.001129"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:55.768310" elapsed="0.053110"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.826600" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.826300" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.826672" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:55.826817" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.825945" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.832983" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.832724" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.833423" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.833182" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.846810" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node010x93477tykfql0cr2ckdcy462.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:55.846951" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:20:55.847113" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:55.835574" elapsed="0.011577"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.833532" elapsed="0.013679"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.847457" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.847247" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.833514" elapsed="0.014069"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.852123" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.849051" elapsed="0.003137"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.848727" elapsed="0.003508"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.848702" elapsed="0.003568"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.855628" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:55.852679" elapsed="0.003011"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.852346" elapsed="0.003391"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.852323" elapsed="0.003449"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.856566" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.856006" elapsed="0.000607"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.857092" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.856731" elapsed="0.000446"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.857878" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.857440" elapsed="0.000476"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.857213" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.856705" elapsed="0.001316"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.858778" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.858249" elapsed="0.000568"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.859284" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.858919" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.860109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.859630" elapsed="0.000523"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.859404" elapsed="0.000801"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.858892" elapsed="0.001346"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.860451" elapsed="0.000539"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:55.861628" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:55.861228" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.861885" elapsed="0.003215"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:55.848072" elapsed="0.017119"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:20:55.865451" elapsed="0.000048"/>
</return>
<status status="PASS" start="2026-04-07T17:20:55.865293" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.865265" elapsed="0.000313"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.865725" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.865795" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:20:55.867921" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:55.827175" elapsed="0.040773"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:55.868013" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.868163" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:20:55.825467" elapsed="0.042721"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.869348" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:20:55.868963" elapsed="0.000450"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:20:55.868817" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:20:55.868685" elapsed="0.000797"/>
</for>
<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="PASS" start="2026-04-07T17:20:55.868406" elapsed="0.001127"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:55.821506" elapsed="0.048107"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:55.726315" elapsed="0.143329"/>
</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 {'ovsdb://uuid': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:20:55.724168" elapsed="0.145529"/>
</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-07T17:20:55.719742" elapsed="0.150008"/>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="PASS" start="2026-04-07T17:20:52.085619" elapsed="3.784193"/>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="PASS" start="2026-04-07T17:20:51.762671" elapsed="4.107261"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-07T17:20:55.870792" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-07T17:20:55.870711" elapsed="0.000172"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Owner failover and recover</doc>
<status status="FAIL" start="2026-04-07T17:19:11.187905" elapsed="104.683012"/>
</suite>
<suite id="s1-s2-s2" name="Southbound Cluster Extension" source="/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/suites/ovsdb/Southbound_Cluster/020__Southbound_Cluster_Extension.robot">
<kw name="Suite Setup" 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-07T17:20:55.948488" 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-07T17:20:55.944545" elapsed="0.003992"/>
</kw>
<doc>Set suite to not fail fast.</doc>
<status status="PASS" start="2026-04-07T17:20:55.944276" elapsed="0.004409"/>
</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-07T17:20:55.953217" 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-07T17:20:55.949772" elapsed="0.003472"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="NOT RUN" start="2026-04-07T17:20:55.953425" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:55.953321" elapsed="0.000146"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.953302" elapsed="0.000186"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.954086" 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-07T17:20:55.953634" elapsed="0.000496"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.954594" level="INFO">${cluster_size} = 3</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-07T17:20:55.954286" 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-07T17:20:55.955126" elapsed="0.000272"/>
</kw>
<msg time="2026-04-07T17:20:55.955493" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:55.955538" level="INFO">${possibly_int_of_members} = 3</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-07T17:20:55.954780" elapsed="0.000780"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.956101" level="INFO">${int_of_members} = 3</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-07T17:20:55.955722" elapsed="0.000404"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.957098" 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-07T17:20:55.956822" elapsed="0.000302"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.957514" level="INFO">@{session_list} = [ ]</msg>
<var>@{session_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:55.957265" elapsed="0.000275"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.957989" 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-07T17:20:55.957692" elapsed="0.000324"/>
</kw>
<for flavor="IN RANGE">
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.960891" elapsed="0.000219"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.961584" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.961265" elapsed="0.000345"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.961757" elapsed="0.000238"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.962762" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.962474" elapsed="0.000314"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.962832" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:20:55.962998" level="INFO">${session_alias} = ClusterManagement__session_1</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.962188" elapsed="0.000835"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.963794" level="INFO">Creating Session using : alias=ClusterManagement__session_1, url=http://10.30.170.175:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf8a0113190&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:20:55.963218" elapsed="0.000703"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.964095" elapsed="0.000191"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:20:55.960323" elapsed="0.004022"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:55.960140" elapsed="0.004286"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.965260" elapsed="0.000185"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.965913" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.965595" elapsed="0.000345"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.966102" elapsed="0.000218"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.967093" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.966788" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.967163" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.967310" level="INFO">${session_alias} = ClusterManagement__session_2</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.966505" elapsed="0.000829"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.967878" level="INFO">Creating Session using : alias=ClusterManagement__session_2, url=http://10.30.171.205:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899c87950&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:20:55.967480" elapsed="0.000514"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.968151" elapsed="0.000188"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:20:55.964695" elapsed="0.003723"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:55.964513" elapsed="0.003950"/>
</iter>
<iter>
<kw name="ClusterManagement__Include_Member_Index" owner="ClusterManagement">
<kw name="Append To List" owner="Collections">
<arg>${member_index_list}</arg>
<arg>${index}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.969286" elapsed="0.000185"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.969938" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>${ODL_SYSTEM_${index}_IP}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.969620" elapsed="0.000344"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${index_to_ip_mapping}</arg>
<arg>${index}</arg>
<arg>${member_ip}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.970124" elapsed="0.000218"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.971114" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:55.970808" elapsed="0.000332"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:55.971184" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.971331" level="INFO">${session_alias} = ClusterManagement__session_3</msg>
<var>${session_alias}</var>
<arg>member_index=${index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:55.970524" elapsed="0.000832"/>
</kw>
<kw name="Create Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:55.971901" level="INFO">Creating Session using : alias=ClusterManagement__session_3, url=http://10.30.170.206:8181, headers={},                     cookies={}, auth=&lt;requests.auth.HTTPBasicAuth object at 0x7cf899c1e410&gt;, timeout=5, proxies=None, verify=False,                     debug=0 </msg>
<arg>${session_alias}</arg>
<arg>http://${member_ip}:${RESTCONFPORT}</arg>
<arg>auth=${AUTH}</arg>
<arg>timeout=${http_timeout}</arg>
<arg>max_retries=${http_retries}</arg>
<doc>Create Session: create a HTTP session to a server</doc>
<status status="PASS" start="2026-04-07T17:20:55.971500" elapsed="0.000520"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${session_list}</arg>
<arg>${session_alias}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.972177" elapsed="0.000186"/>
</kw>
<arg>${index}</arg>
<arg>${member_index_list}</arg>
<arg>${session_list}</arg>
<arg>${index_to_ip_mapping}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Add a corresponding item based on index into the last three arguments.
Create the Http session whose alias is added to list.</doc>
<status status="PASS" start="2026-04-07T17:20:55.968724" elapsed="0.003712"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:55.968545" elapsed="0.003934"/>
</iter>
<var>${index}</var>
<value>1</value>
<value>${int_of_members+1}</value>
<status status="PASS" start="2026-04-07T17:20:55.958068" elapsed="0.014439"/>
</for>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.973124" level="INFO">${ClusterManagement__member_index_list} = [1, 2, 3]</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-07T17:20:55.972709" elapsed="0.000458"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.973721" level="INFO">${ClusterManagement__index_to_ip_mapping} = {1: '10.30.170.175', 2: '10.30.171.205', 3: '10.30.170.206'}</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-07T17:20:55.973325" elapsed="0.000438"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.974317" level="INFO">${ClusterManagement__session_list} = ['ClusterManagement__session_1', 'ClusterManagement__session_2', 'ClusterManagement__session_3']</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-07T17:20:55.973919" 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-07T17:20:55.956362" elapsed="0.018054"/>
</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-07T17:20:55.949435" elapsed="0.025035"/>
</kw>
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:55.974646" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:55.974535" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.974517" 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-07T17:20:55.977811" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:55.977437" elapsed="0.000400"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.978317" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:55.978010" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:55.978387" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:55.978538" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:55.977119" elapsed="0.001443"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:55.979542" level="INFO">${member_ip} = 10.30.170.175</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:55.979281" elapsed="0.000287"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.980300" 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-07T17:20:55.980419" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:55.980139" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:55.983901" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:55.983264" elapsed="0.000757"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:55.983221" elapsed="0.000870"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.984752" 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-07T17:20:55.985037" 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-07T17:20:55.984370" elapsed="0.000768"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.986030" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.175" 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-07T17:20:55.985399" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.987198" level="INFO">${conn_id} = 593</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-07T17:20:55.986454" elapsed="0.000846"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:55.988746" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:55.988823" 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-07T17:20:55.988470" 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-07T17:20:55.989113" elapsed="0.000327"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:55.990564" level="INFO">Logging into '10.30.170.175:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:56.580609" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:20:56 UTC 2026

  System load:  0.64               Processes:             121
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.175
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:11 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:55.990110" elapsed="0.590589"/>
</kw>
<msg time="2026-04-07T17:20:56.580761" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.989657" elapsed="0.591167"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:55.987656" elapsed="0.593394"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:56.581815" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:20:56.594554" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:20:56.594860" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:56.595043" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:56.581369" elapsed="0.013789"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:56.595449" elapsed="0.000575"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:56.597206" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:56.596651" elapsed="0.000729"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:56.597827" elapsed="0.000032"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:56.597533" elapsed="0.000374"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:56.597485" elapsed="0.000514"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:56.598418" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-07T17:20:56.598145" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:56.598103" elapsed="0.000513"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:56.598718" elapsed="0.000016"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:56.602072" elapsed="0.000396"/>
</kw>
<kw name="Open 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-07T17:20:56.602731" elapsed="0.000221"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:56.603216" elapsed="0.000169"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:56.599325" elapsed="0.004137"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:55.982239" elapsed="0.621501"/>
</kw>
<msg time="2026-04-07T17:20:56.603913" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.981581" elapsed="0.622428"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:20:55.981104" elapsed="0.622994"/>
</kw>
<msg time="2026-04-07T17:20:56.604139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:55.980599" elapsed="0.623586"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:56.606849" elapsed="0.000325"/>
</kw>
<kw name="Open 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-07T17:20:56.607375" elapsed="0.000144"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:56.607662" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:56.604471" elapsed="0.003336"/>
</kw>
<msg time="2026-04-07T17:20:56.607925" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:20:55.979777" elapsed="0.628172"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:56.608390" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:56.608145" elapsed="0.000286"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:20:56.608472" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:20:55.978903" elapsed="0.629694"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:55.978734" elapsed="0.629900"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:56.609630" level="INFO">${member_ip} = 10.30.171.205</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:56.609365" elapsed="0.000292"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:56.610366" 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-07T17:20:56.610463" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:56.610236" elapsed="0.000252"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:56.615724" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:56.615040" elapsed="0.000805"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:56.614993" elapsed="0.000930"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:56.616632" 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-07T17:20:56.616924" 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-07T17:20:56.616222" elapsed="0.000842"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:56.618015" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.171.205" 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-07T17:20:56.617341" elapsed="0.000852"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:56.619267" level="INFO">${conn_id} = 596</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-07T17:20:56.618473" elapsed="0.000906"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:56.620844" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:56.620919" 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-07T17:20:56.620572" elapsed="0.000370"/>
</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-07T17:20:56.621173" elapsed="0.000318"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:56.622570" level="INFO">Logging into '10.30.171.205:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:57.265614" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:20:56 UTC 2026

  System load:  0.08               Processes:             122
  Usage of /:   11.2% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.171.205
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:12 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-1 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:56.622251" elapsed="0.643535"/>
</kw>
<msg time="2026-04-07T17:20:57.265869" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:56.621701" elapsed="0.644335"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:56.619761" elapsed="0.646525"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.267162" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:20:57.280377" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:20:57.281025" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:57.281340" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:57.266656" elapsed="0.014894"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.282195" elapsed="0.001061"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.285758" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:57.284567" elapsed="0.001566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:57.287103" elapsed="0.000070"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:57.286466" elapsed="0.000809"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:57.286360" elapsed="0.001125"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:57.288447" elapsed="0.000142"/>
</return>
<status status="PASS" start="2026-04-07T17:20:57.287781" elapsed="0.000907"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:57.287693" elapsed="0.001088"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:57.288902" elapsed="0.000023"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.293756" elapsed="0.000584"/>
</kw>
<kw name="Open 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-07T17:20:57.294689" elapsed="0.000324"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.295371" elapsed="0.000222"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:57.289693" elapsed="0.006006"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:56.613923" elapsed="0.682214"/>
</kw>
<msg time="2026-04-07T17:20:57.296289" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:56.613231" elapsed="0.683130"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:20:56.611142" elapsed="0.685330"/>
</kw>
<msg time="2026-04-07T17:20:57.296529" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:56.610637" elapsed="0.685955"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.300091" elapsed="0.000310"/>
</kw>
<kw name="Open 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-07T17:20:57.300567" elapsed="0.000143"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.300853" elapsed="0.000095"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:57.297006" elapsed="0.004009"/>
</kw>
<msg time="2026-04-07T17:20:57.301108" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:20:56.609868" elapsed="0.691266"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.301585" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:57.301333" elapsed="0.000293"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:20:57.301668" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:20:56.608894" elapsed="0.692896"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:56.608721" elapsed="0.693109"/>
</iter>
<iter>
<kw name="Run_Bash_Command_On_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:57.302762" level="INFO">${member_ip} = 10.30.170.206</msg>
<var>${member_ip}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:57.302487" elapsed="0.000337"/>
</kw>
<kw name="Run_Keyword_Preserve_Connection" owner="SSHKeywords">
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.303572" 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-07T17:20:57.303671" level="INFO">${current_connection} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_connection}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.303431" elapsed="0.000266"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Controller" owner="Utils">
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Run Command On Remote System" owner="Utils">
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot; and &quot;${return_stderr}&quot;!=&quot;True&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>At least one of {return_stdout} or {return_stderr} args should be set to True</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:57.307172" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:57.306542" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:57.306500" elapsed="0.000862"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.308015" 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-07T17:20:57.308279" 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-07T17:20:57.307623" elapsed="0.000753"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.309257" level="INFO">Attempting to execute command "iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save" on remote system "10.30.170.206" 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-07T17:20:57.308637" elapsed="0.000775"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.310405" level="INFO">${conn_id} = 599</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-07T17:20:57.309671" elapsed="0.000832"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.311949" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:20:57.312043" 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-07T17:20:57.311654" elapsed="0.000423"/>
</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-07T17:20:57.312277" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.313787" level="INFO">Logging into '10.30.170.206:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:20:57.955857" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-171-generic x86_64)

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

 System information as of Tue Apr  7 17:20:57 UTC 2026

  System load:  0.44               Processes:             120
  Usage of /:   11.1% of 77.35GB   Users logged in:       0
  Memory usage: 7%                 IPv4 address for ens3: 10.30.170.206
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:19:13 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-0-builder-2 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:20:57.313444" elapsed="0.642630"/>
</kw>
<msg time="2026-04-07T17:20:57.956211" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.312804" elapsed="0.643536"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:20:57.310862" elapsed="0.645907"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:20:57.958495" level="INFO">Executing command 'iptables -I INPUT -p tcp --dport 8101 -j ACCEPT; iptables-save'.</msg>
<msg time="2026-04-07T17:20:57.971960" level="INFO">Command exited with return code 4.</msg>
<msg time="2026-04-07T17:20:57.972414" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:20:57.972643" level="INFO">${stderr} = iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission ...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:20:57.957495" elapsed="0.015308"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.973239" elapsed="0.000771"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.975880" level="INFO">iptables v1.8.7 (nf_tables): unknown option "--dport"
Try `iptables -h' or 'iptables --help' for more information.
iptables-save v1.8.7 (nf_tables): Could not fetch rule set generation id: Permission denied (you must be root)</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:57.974954" elapsed="0.001365"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:57.977484" elapsed="0.000075"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:57.976681" elapsed="0.000985"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:57.976567" elapsed="0.001267"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:20:57.978846" elapsed="0.000178"/>
</return>
<status status="PASS" start="2026-04-07T17:20:57.978203" elapsed="0.000938"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:57.978107" elapsed="0.001207"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:20:57.979534" elapsed="0.000037"/>
</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-07T17:20:57.987256" elapsed="0.000687"/>
</kw>
<kw name="Open 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-07T17:20:57.988224" elapsed="0.000231"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.988703" elapsed="0.000169"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:57.980862" elapsed="0.008087"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:20:57.305540" elapsed="0.683777"/>
</kw>
<msg time="2026-04-07T17:20:57.989436" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.304896" elapsed="0.684594"/>
</kw>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Controller machine.</doc>
<status status="PASS" start="2026-04-07T17:20:57.304417" elapsed="0.685155"/>
</kw>
<msg time="2026-04-07T17:20:57.989612" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>${keyword_name}</arg>
<arg>@{args}</arg>
<arg>&amp;{kwargs}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.303847" elapsed="0.685820"/>
</kw>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:57.992196" elapsed="0.000306"/>
</kw>
<kw name="Open 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-07T17:20:57.992666" elapsed="0.000143"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:57.992951" elapsed="0.000114"/>
</kw>
<arg>${current_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:57.989956" elapsed="0.003168"/>
</kw>
<msg time="2026-04-07T17:20:57.993217" level="INFO">${output} = </msg>
<var>${output}</var>
<arg>Utils.Run_Command_On_Controller</arg>
<arg>${member_ip}</arg>
<arg>${command}</arg>
<doc>Store current connection index, run keyword returning its result, restore connection in teardown.
Note that in order to avoid "got positional argument after named arguments", it is safer to use positional (not named) arguments on call.</doc>
<status status="PASS" start="2026-04-07T17:20:57.303056" elapsed="0.690186"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:57.993661" level="INFO"/>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:57.993414" elapsed="0.000288"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:20:57.993743" elapsed="0.000029"/>
</return>
<arg>command=${command}</arg>
<arg>member_index=${index}</arg>
<doc>Obtain IP, call Utils and return output. This keeps previous ssh session active.</doc>
<status status="PASS" start="2026-04-07T17:20:57.302131" elapsed="0.691734"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:57.301929" elapsed="0.691975"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:55.978612" elapsed="2.015329"/>
</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-07T17:20:55.974925" elapsed="2.019171"/>
</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-07T17:20:57.994250" elapsed="0.000213"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.007296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.007186" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.007167" elapsed="0.000196"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.007648" 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-07T17:20:58.007750" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.007512" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.008201" level="INFO">{}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.007923" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.008640" level="INFO">1</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.008394" elapsed="0.000326"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.009484" level="FAIL">Dictionary does not contain key '1'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:20:58.009254" elapsed="0.000345">Dictionary does not contain key '1'.</status>
</kw>
<msg time="2026-04-07T17:20:58.009705" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:58.009749" level="INFO">${old_connection_index} = Dictionary does not contain key '1'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.008877" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.010087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.009848" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.009829" elapsed="0.000358"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.011186" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.010650" elapsed="0.000569"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:58.011274" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:20:58.011434" level="INFO">${odl_ip} = 10.30.170.175</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.010383" elapsed="0.001075"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.011617" elapsed="0.000431"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.012370" level="INFO">index=602
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:20:58.012469" level="INFO">${karaf_connection_object} = index=602
host=10.30.170.175
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.012213" elapsed="0.000281"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.012639" elapsed="0.002066"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.015154" level="INFO">Logging into '10.30.170.175:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:20:58.233787" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.014879" elapsed="0.219001"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:58.237012" elapsed="0.000387"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.237559" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.237852" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.234741" elapsed="0.003283"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:58.234165" elapsed="0.003906"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.006892" elapsed="0.231230"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:20:57.995216" elapsed="0.242952"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:57.994824" elapsed="0.243395"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:57.994674" elapsed="0.243627"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.250673" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.250541" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.250521" elapsed="0.000224"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.251045" 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-07T17:20:58.251156" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.250893" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.251588" level="INFO">{1: 602}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.251330" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.252036" level="INFO">2</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.251780" elapsed="0.000300"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.252796" level="FAIL">Dictionary does not contain key '2'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:20:58.252584" elapsed="0.000314">Dictionary does not contain key '2'.</status>
</kw>
<msg time="2026-04-07T17:20:58.253018" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:58.253064" level="INFO">${old_connection_index} = Dictionary does not contain key '2'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.252234" elapsed="0.000853"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.253376" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.253161" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.253143" elapsed="0.000333"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.254213" level="INFO">${ip_address} = 10.30.171.205</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.253935" elapsed="0.000304"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:58.254286" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:58.254434" level="INFO">${odl_ip} = 10.30.171.205</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.253669" elapsed="0.000790"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.254619" elapsed="0.000411"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.255350" level="INFO">index=604
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:20:58.255448" level="INFO">${karaf_connection_object} = index=604
host=10.30.171.205
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.255197" elapsed="0.000276"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.255614" elapsed="0.002034"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.258082" level="INFO">Logging into '10.30.171.205:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:20:58.472467" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.257812" elapsed="0.214741"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:58.475391" elapsed="0.000387"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.475937" elapsed="0.000215"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.476300" elapsed="0.000102"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.473353" elapsed="0.003100"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:58.472811" elapsed="0.003686"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.250261" elapsed="0.226286"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:20:58.238915" elapsed="0.237678"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.238532" elapsed="0.238111"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:58.238397" elapsed="0.238287"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.489003" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.488878" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.488857" elapsed="0.000217"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.489351" 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-07T17:20:58.489453" level="INFO">${current_ssh_connection_object} = index=None
host=None
alias=None
port=22
timeout=3 seconds
newline=

prompt=None
term_type=vt100
width=80
height=24
path_separator=/
encoding=utf8
escape_ansi=False
encoding_errors=strict</msg>
<var>${current_ssh_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.489221" elapsed="0.000257"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.489883" level="INFO">{1: 602, 2: 604}</msg>
<arg>${connection_index_dict}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.489626" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.490330" level="INFO">3</msg>
<arg>${member_index}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.490089" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.491126" level="FAIL">Dictionary does not contain key '3'.</msg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="FAIL" start="2026-04-07T17:20:58.490897" elapsed="0.000319">Dictionary does not contain key '3'.</status>
</kw>
<msg time="2026-04-07T17:20:58.491319" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:20:58.491363" level="INFO">${old_connection_index} = Dictionary does not contain key '3'.</msg>
<var>${status}</var>
<var>${old_connection_index}</var>
<arg>Get From Dictionary</arg>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.490549" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='PASS'">
<kw name="Run Keywords" owner="BuiltIn">
<arg>SSHLibrary.Switch_Connection</arg>
<arg>${old_connection_index}</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Write</arg>
<arg>logout</arg>
<arg>AND</arg>
<arg>BuiltIn.Run_Keyword_And_Ignore_Error</arg>
<arg>SSHLibrary.Close_Connection</arg>
<doc>Executes all the given keywords in a sequence.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.491681" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.491461" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.491443" elapsed="0.000336"/>
</if>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.492511" level="INFO">${ip_address} = 10.30.170.206</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.492251" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:20:58.492583" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:58.492731" level="INFO">${odl_ip} = 10.30.170.206</msg>
<var>${odl_ip}</var>
<arg>${member_index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.491984" elapsed="0.000771"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>${odl_ip}</arg>
<arg>port=${KARAF_SHELL_PORT}</arg>
<arg>prompt=${KARAF_PROMPT_LOGIN}</arg>
<arg>timeout=${timeout}</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.492901" elapsed="0.000404"/>
</kw>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.493625" level="INFO">index=606
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_errors=strict</msg>
<msg time="2026-04-07T17:20:58.493722" level="INFO">${karaf_connection_object} = index=606
host=10.30.170.206
alias=None
port=8101
timeout=10 seconds
newline=

prompt=opendaylight-user
term_type=vt100
width=80
height=24
path_separator=/
encoding=UTF-8
escape_ansi=False
encoding_er...</msg>
<var>${karaf_connection_object}</var>
<doc>Returns information about the connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.493471" elapsed="0.000277"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<arg>${karaf_connection_object.index}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.493888" elapsed="0.002226"/>
</kw>
<kw name="Login" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.496530" level="INFO">Logging into '10.30.170.206:8101' as 'karaf'.</msg>
<msg time="2026-04-07T17:20:58.737957" level="INFO">Read output: [33m                                                                                           
[33m    ________                       ________                .__  .__       .__     __       
[33m    \_____  \ ______   ____   ____ \______ \ _____  ___.__.|  | |__| ____ |  |___/  |_     
[33m     /   |   \\____ \_/ __ \ /    \ |    |  \\__  \&lt;   |  ||  | |  |/ ___\|  |  \   __\    
[33m    /    |    \  |_&gt; &gt;  ___/|   |  \|    `   \/ __ \\___  ||  |_|  / /_/  &gt;   Y  \  |      
[33m    \_______  /   __/ \___  &gt;___|  /_______  (____  / ____||____/__\___  /|___|  /__|      
[33m            \/|__|        \/     \/        \/     \/\/            /_____/      \/          
[33m                                                                                           

Hit '[1m&lt;tab&gt;[0m' for a list of available commands
and '[1m[cmd] --help[0m' for help on a specific command.
Hit '[1m&lt;ctrl-d&gt;[0m' or type '[1msystem:shutdown[0m' or '[1mlogout[0m' to shutdown OpenDaylight.

[?1h=[90m~[0m                                                                                [?2004hopendaylight-user</msg>
<arg>${KARAF_USER}</arg>
<arg>${KARAF_PASSWORD}</arg>
<arg>loglevel=${loglevel}</arg>
<doc>Logs into the SSH server with the given ``username`` and ``password``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.496275" elapsed="0.241842"/>
</kw>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:58.741116" elapsed="0.000388"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.741661" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.741964" elapsed="0.000120"/>
</kw>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.739010" elapsed="0.003127"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_ssh_connection_object.index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:58.738423" elapsed="0.003760"/>
</kw>
<arg>member_index=${index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for ${member_index},
close the previous connection. In any case create a new connection
to karaf console for ${member_index}, set correct prompt set and login to karaf console.
Store connection index for ${member_index} and restore the previous active connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.488604" elapsed="0.253668"/>
</kw>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:20:58.477289" elapsed="0.265030"/>
</kw>
<arg>BuiltIn.Wait_Until_Keyword_Succeeds</arg>
<arg>3s</arg>
<arg>1s</arg>
<arg>Open_Controller_Karaf_Console_On_Background</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.476908" elapsed="0.265462"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:58.476774" elapsed="0.265638"/>
</iter>
<var>${index}</var>
<value>@{ClusterManagement__member_index_list}</value>
<status status="PASS" start="2026-04-07T17:20:57.994522" elapsed="0.747924"/>
</for>
<arg>http_timeout=${http_timeout}</arg>
<doc>Initialize ClusterManagement. Open ssh karaf connections to each ODL.</doc>
<status status="PASS" start="2026-04-07T17:20:55.948996" elapsed="2.793513"/>
</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-07T17:20:58.745016" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.744887" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.744865" 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-07T17:20:58.749477" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.749370" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.749352" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.750512" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:58.750110" elapsed="0.000429"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.751017" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:58.750698" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:58.751087" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:20:58.751244" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:58.749770" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.756455" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.756348" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.756329" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.757807" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.757630" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.757613" elapsed="0.000330"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.758535" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.758108" elapsed="0.000467"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.759074" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:58.758806" elapsed="0.000307"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.789369" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:58.760656" elapsed="0.028871"/>
</kw>
<msg time="2026-04-07T17:20:58.789697" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:58.789770" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.759331" elapsed="0.030547"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.831999" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:58.791525" elapsed="0.040642"/>
</kw>
<msg time="2026-04-07T17:20:58.832316" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:58.832388" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.790196" elapsed="0.042243"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.832917" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.832602" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.832581" elapsed="0.000538"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.833793" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.833260" elapsed="0.000667"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.834409" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.834071" elapsed="0.000482"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.834051" elapsed="0.000528"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:58.834611" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:58.836424" elapsed="0.000306"/>
</kw>
<kw name="Open 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-07T17:20:58.836931" elapsed="0.000183"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.837303" elapsed="0.000109"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.835757" elapsed="0.001764"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:58.834864" elapsed="0.002751"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:58.757289" elapsed="0.080424"/>
</kw>
<msg time="2026-04-07T17:20:58.837802" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:58.837844" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.756673" elapsed="0.081208"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:58.838112" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:20:58.837957" elapsed="0.000226"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.837938" elapsed="0.000270"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.838639" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.839029" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.839101" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:58.756057" elapsed="0.083159"/>
</kw>
<msg time="2026-04-07T17:20:58.839307" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:58.839351" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.751634" elapsed="0.087753"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.839751" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.839466" elapsed="0.000341"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.839449" elapsed="0.000382"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:58.751497" elapsed="0.088357"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.845040" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.844904" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.844886" elapsed="0.000222"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.846436" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.846257" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.846238" elapsed="0.000340"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.847155" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.846723" elapsed="0.000472"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.847675" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:58.847422" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.881146" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:58.849273" elapsed="0.032015"/>
</kw>
<msg time="2026-04-07T17:20:58.881445" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:58.881520" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.847934" elapsed="0.033637"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.940687" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:58.883207" elapsed="0.057651"/>
</kw>
<msg time="2026-04-07T17:20:58.941033" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:58.941108" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.881826" elapsed="0.059332"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.941641" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.941323" elapsed="0.000461"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.941301" elapsed="0.000510"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:58.942549" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:58.941951" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.943138" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.942810" elapsed="0.000468"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.942790" elapsed="0.000514"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:58.943337" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:58.945156" 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-07T17:20:58.945668" elapsed="0.000150"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:58.946030" elapsed="0.000117"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:58.944482" elapsed="0.001771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:58.943590" elapsed="0.002754"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:58.845838" elapsed="0.100647"/>
</kw>
<msg time="2026-04-07T17:20:58.946577" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:58.946621" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.845255" elapsed="0.101403"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:58.946841" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:58.946734" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.946715" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.947394" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.947767" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.947839" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:58.844577" elapsed="0.103369"/>
</kw>
<msg time="2026-04-07T17:20:58.948055" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:58.948098" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.840127" elapsed="0.108008"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:58.948453" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:58.948209" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.948192" elapsed="0.000337"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:58.839989" elapsed="0.108563"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.953707" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.953600" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.953582" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:58.955160" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:58.954921" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:58.954903" elapsed="0.000394"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:58.955845" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:58.955439" elapsed="0.000446"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.956375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:58.956130" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:58.986280" level="INFO">@root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "r "k "s "p "a "c "e "/ "o "v "s "[78Cd "[A[78Cb</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:58.957943" elapsed="0.028493"/>
</kw>
<msg time="2026-04-07T17:20:58.986590" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:58.986662" level="INFO">${message_write} = @root&gt;log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "s "u "i "t "e "[C "/ "w "/ "w "o "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.956633" elapsed="0.030080"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.041600" level="INFO">"- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:58.988312" elapsed="0.053455"/>
</kw>
<msg time="2026-04-07T17:20:59.041917" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:59.042039" level="INFO">${message_wait} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.986965" elapsed="0.055128"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.042571" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.042257" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.042236" elapsed="0.000550"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.043478" level="INFO"> "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n "a "d "i "u "m "/ "t "e "s "t "/ "c "s "i "t "/ "s "u "i "t "e "s "/ "o "v "s "d "b "/ "S "o "u "t "h "b "o "u "n "[78Cd "[A[78C_
 "C "l "u "s "t "e "r "/ "0 "2 "0 "_ "_ "S "o "u "t "h "b "o "u "n "d "_ "C "l "u "s "t "e "r "_ "E "x "t "e "n "s "i "o "n ". "r "o "b "o "t "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.042925" elapsed="0.000686"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.044067" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.043734" elapsed="0.000477"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.043714" elapsed="0.000523"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:59.044270" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.046167" 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-07T17:20:59.046673" elapsed="0.000146"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:59.047020" elapsed="0.000100"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.045454" elapsed="0.001771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:59.044522" elapsed="0.002794"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:58.954579" elapsed="0.092835"/>
</kw>
<msg time="2026-04-07T17:20:59.047502" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.047546" level="INFO">${message} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.953920" elapsed="0.093665"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:59.047789" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.047677" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.047654" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.048313" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.048687" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.048757" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:58.953309" elapsed="0.095555"/>
</kw>
<msg time="2026-04-07T17:20:59.048954" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.049077" level="INFO">${output} =  "- "c "s "i "t "- "3 "n "o "d "e "- "u "p "s "t "r "e "a "m "- "c "l "u "s "t "e "r "i "n "g "- "o "n "l "y "- "v "a "n ...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:58.948804" elapsed="0.100311"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.049433" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.049189" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.049172" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:58.948670" elapsed="0.100861"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:58.751326" elapsed="0.298235"/>
</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-07T17:20:58.749083" elapsed="0.300533"/>
</kw>
<doc>Log suite name to karaf log, useful in suite setup.</doc>
<status status="PASS" start="2026-04-07T17:20:58.743119" elapsed="0.306551"/>
</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-07T17:20:58.742662" elapsed="0.307048"/>
</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-07T17:20:55.943948" elapsed="3.105816"/>
</kw>
<kw name="ClusterManagement_Setup" owner="ClusterManagement">
<kw name="Get Variable Value" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.050688" level="INFO">${already_done} = True</msg>
<var>${already_done}</var>
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>False</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="PASS" start="2026-04-07T17:20:59.050357" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="${already_done}">
<return>
<status status="PASS" start="2026-04-07T17:20:59.050916" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.050821" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.050804" elapsed="0.000206"/>
</if>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>\${ClusterManagement__has_setup_run}</arg>
<arg>True</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.051164" elapsed="0.000021"/>
</kw>
<kw name="Get Variable Value" owner="BuiltIn">
<var>${cluster_size}</var>
<arg>\${NUM_ODL_SYSTEM}</arg>
<arg>1</arg>
<doc>Returns variable value or ``default`` if the variable does not exist.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.051334" elapsed="0.000019"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<var>${status}</var>
<var>${possibly_int_of_members}</var>
<arg>BuiltIn.Convert_To_Integer</arg>
<arg>${cluster_size}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.051503" elapsed="0.000019"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${int_of_members}</var>
<arg>'${status}' != 'PASS'</arg>
<arg>${1}</arg>
<arg>${possibly_int_of_members}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.051676" elapsed="0.000020"/>
</kw>
<kw name="ClusterManagement__Compute_Derived_Variables" owner="ClusterManagement">
<arg>int_of_members=${int_of_members}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>http_retries=${http_retries}</arg>
<doc>Construct index list, session list and IP mapping, publish them as suite variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.051929" elapsed="0.000023"/>
</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-07T17:20:59.050057" elapsed="0.001986"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:55.943672" elapsed="3.108422"/>
</kw>
<test id="s1-s2-s2-t1" name="Check Shards Status Before Fail" line="17">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:20:59.055630" elapsed="0.000211"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:20:59.055369" 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-07T17:20:59.056876" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.056767" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.056749" 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-07T17:20:59.061446" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.061340" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.061322" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.062501" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.062127" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.063006" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:59.062689" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:59.063077" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.063230" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:59.061731" elapsed="0.001523"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.068282" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.068175" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.068157" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.069574" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.069469" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.069451" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.070161" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.069782" elapsed="0.000406"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.070590" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:59.070342" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.102294" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:59.071158" elapsed="0.031299"/>
</kw>
<msg time="2026-04-07T17:20:59.102623" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:59.102669" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.070768" elapsed="0.032033"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.157350" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:59.103383" elapsed="0.054156"/>
</kw>
<msg time="2026-04-07T17:20:59.157714" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:59.157760" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.102991" elapsed="0.054807"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.158128" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.157876" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.157856" elapsed="0.000374"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.158736" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.158367" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.159122" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.158887" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.158869" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:59.159256" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.161532" elapsed="0.000557"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.163023" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:59.164423" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.160091" elapsed="0.004720"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:59.159507" elapsed="0.005415"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:59.069169" elapsed="0.095868"/>
</kw>
<msg time="2026-04-07T17:20:59.165127" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.165171" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.068494" elapsed="0.096713"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:59.165387" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.165281" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.165263" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.165842" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.166193" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.166262" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:59.067831" elapsed="0.098537"/>
</kw>
<msg time="2026-04-07T17:20:59.166459" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.166501" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.063614" elapsed="0.102925"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.166857" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.166612" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.166596" elapsed="0.000388"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:59.063476" elapsed="0.103534"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.172212" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.171898" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.171880" elapsed="0.000400"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.173462" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.173358" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.173340" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.174067" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.173665" elapsed="0.000428"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.174495" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:59.174245" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.206818" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:59.175063" elapsed="0.031999"/>
</kw>
<msg time="2026-04-07T17:20:59.207240" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:59.207287" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.174672" elapsed="0.032652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.260266" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:59.207896" elapsed="0.052564"/>
</kw>
<msg time="2026-04-07T17:20:59.260631" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:59.260676" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.207500" elapsed="0.053212"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.261019" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.260788" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.260769" elapsed="0.000350"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.261621" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.261256" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.262009" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.261769" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.261751" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:59.262141" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.265908" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:20:59.267364" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:59.268804" elapsed="0.000385"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.264434" elapsed="0.004826"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:59.262394" elapsed="0.006977"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:59.173063" elapsed="0.096407"/>
</kw>
<msg time="2026-04-07T17:20:59.269559" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.269603" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.172426" elapsed="0.097245"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:59.269883" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.269751" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.269732" elapsed="0.000250"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.270362" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.270687" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.270759" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:59.171564" elapsed="0.099301"/>
</kw>
<msg time="2026-04-07T17:20:59.270956" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.271014" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.167270" elapsed="0.103782"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.271368" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.271127" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.271110" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:59.167133" elapsed="0.104335"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.276689" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.276577" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.276559" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.278060" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.277872" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.277854" elapsed="0.000277"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.278626" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.278271" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.279070" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:20:59.278802" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.310927" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:20:59.279647" elapsed="0.031558"/>
</kw>
<msg time="2026-04-07T17:20:59.311372" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:20:59.311418" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.279250" elapsed="0.032204"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:20:59.359850" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:20:59.312030" elapsed="0.048028"/>
</kw>
<msg time="2026-04-07T17:20:59.360228" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:20:59.360273" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.311624" elapsed="0.048685"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.360602" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.360386" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.360366" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.361243" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CB
 "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.360839" elapsed="0.000534"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.361651" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.361440" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.361422" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:20:59.361801" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.364094" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.365537" elapsed="0.000522"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:20:59.367077" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.362637" elapsed="0.004833"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:20:59.362068" elapsed="0.005514"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:20:59.277558" elapsed="0.090128"/>
</kw>
<msg time="2026-04-07T17:20:59.367776" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.367820" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.276903" elapsed="0.090954"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:20:59.368056" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.367933" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.367914" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.368518" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.369075" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.369152" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:20:59.276241" elapsed="0.093019"/>
</kw>
<msg time="2026-04-07T17:20:59.369352" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:20:59.369396" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.271754" elapsed="0.097678"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.369764" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.369507" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.369489" elapsed="0.000354"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:59.271589" elapsed="0.098277"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:59.063310" elapsed="0.306584"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:20:59.060984" elapsed="0.308962"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:20:59.056486" elapsed="0.313648"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:20:59.056066" elapsed="0.314114"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:20:59.052944" elapsed="0.317286"/>
</kw>
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:20:59.389820" elapsed="0.000254"/>
</kw>
<msg time="2026-04-07T17:20:59.390122" 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-07T17:20:59.389184" elapsed="0.000989"/>
</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 [['topology', 'default', 'entity-ownership'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.388719" elapsed="0.001527"/>
</kw>
<msg time="2026-04-07T17:20:59.390328" 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-07T17:20:59.380789" elapsed="0.009584"/>
</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-07T17:20:59.380398" elapsed="0.010049"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.390866" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.390615" elapsed="0.000295"/>
</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-07T17:20:59.395781" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.395404" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.396277" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:59.395960" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:20:59.396348" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.396500" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:20:59.395040" elapsed="0.001484"/>
</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-07T17:20:59.396679" elapsed="0.000154"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.397335" 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-07T17:20:59.397003" elapsed="0.000359"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.397767" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:59.397514" elapsed="0.000280"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.398191" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:20:59.397938" elapsed="0.000279"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.400824" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.400484" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:59.400895" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:59.401069" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.400145" elapsed="0.000950"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.449322" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.448937" elapsed="0.000413"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.450130" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.449859" elapsed="0.000349">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.450300" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.449506" elapsed="0.000818"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.450860" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.450483" elapsed="0.000404"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.451196" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:59.451365" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:59.451058" elapsed="0.000332"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.451823" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.451578" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.452952" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.452696" elapsed="0.000316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.453442" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.453172" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.453792" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.454008" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.454177" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.453649" elapsed="0.000584"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.453514" elapsed="0.000749"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:59.454305" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.454461" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:59.452240" elapsed="0.002246"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.451934" elapsed="0.002583"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.454682" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.454541" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.451915" elapsed="0.002842"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.455353" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.454895" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.455426" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:59.448336" elapsed="0.007211"/>
</kw>
<msg time="2026-04-07T17:20:59.455599" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.436680" elapsed="0.019024"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.467445" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.479141" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.490698" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.491114" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.491491" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.492048" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.491888" elapsed="0.000218"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:59.491873" elapsed="0.000257"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.492265" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.492428" 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-07T17:20:59.492588" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.491843" elapsed="0.000798"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.491706" elapsed="0.000973"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.492989" elapsed="0.000056"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.493146" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.493334" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:59.431284" elapsed="0.062100"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.495708" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.495465" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.495960" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.495055" elapsed="0.000978"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.496495" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.496172" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.497154" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.496840" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.496631" elapsed="0.000607"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.496131" elapsed="0.001161"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.499949" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.497589" elapsed="0.002534"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:59.500219" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:59.500499" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.494238" elapsed="0.006310"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.502792" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.502554" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.503071" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.502146" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:59.503473" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.503255" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.503214" elapsed="0.000416"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.503925" elapsed="0.000128"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.504376" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.504522" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.506418" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.501329" elapsed="0.005140"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.509952" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.509591" elapsed="0.000476"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.510714" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.510390" elapsed="0.000419"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.526709" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.527169" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:20:59 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:59.527473" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.513048" elapsed="0.014453"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.510945" elapsed="0.016625"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.527901" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.527634" elapsed="0.000375"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.510904" elapsed="0.017161"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.532113" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.529605" elapsed="0.002720"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.529388" elapsed="0.002973"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.529368" elapsed="0.003019"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.535303" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.532662" elapsed="0.002687"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.532443" elapsed="0.002941"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.532426" elapsed="0.002984"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.535952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.535567" elapsed="0.000427"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.536298" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.536067" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.536831" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.536532" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.536380" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.536048" elapsed="0.000865"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.537443" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.537080" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.537780" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.537540" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.538344" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.538046" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.537863" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.537522" elapsed="0.000905"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.538568" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:59.539378" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.539095" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.539551" elapsed="0.002128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.528823" elapsed="0.013006"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.542183" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.541987" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.541926" elapsed="0.000379"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:59.548314" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:59.542601" elapsed="0.005761"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:59.548458" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:20:59.548748" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.507243" elapsed="0.041555"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.549036" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.549293" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.408748" elapsed="0.140571"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.549667" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.549402" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.549385" elapsed="0.000767"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.550186" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:59.404828" elapsed="0.145484"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.401163" elapsed="0.149191"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.401145" elapsed="0.149233"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.551044" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.550898" elapsed="0.000190"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:59.551211" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.551110" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.550881" elapsed="0.000409"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.551429" elapsed="0.000023"/>
</kw>
<msg time="2026-04-07T17:20:59.551548" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:59.550634" elapsed="0.000939"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.552115" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.551733" elapsed="0.000409"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.552746" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.552293" elapsed="0.000480"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.558797" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.558265" elapsed="0.000615"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.559678" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.559128" elapsed="0.000647"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.574384" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.574489" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:59 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":266,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:20:54.816","LastApplied":670,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":670,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.100","active":true,"matchIndex":670,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":671},{"timeSinceLastActivity":"00:00:00.100","active":true,"matchIndex":670,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":671}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"769.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":175,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":68,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582459,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:59.574640" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.564453" elapsed="0.010239"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.559863" elapsed="0.014984"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.575078" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.574877" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.559842" elapsed="0.015505"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.579468" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":266,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:20:54.816","LastApplied":670,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":670,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.100","active":true,"matchIndex":670,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":671},{"timeSinceLastActivity":"00:00:00.100","active":true,"matchIndex":670,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":671}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"769.6 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":175,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":68,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.577228" elapsed="0.002352"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.576735" elapsed="0.002919"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.576692" elapsed="0.003030"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.582556" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.580375" elapsed="0.002281"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.579865" elapsed="0.002858"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.579825" elapsed="0.002964"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.584146" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.583339" elapsed="0.000905"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.584867" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.584382" elapsed="0.000624"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.585915" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.585422" elapsed="0.000538"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.585075" elapsed="0.000970"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.584340" elapsed="0.001769"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.587425" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.586642" elapsed="0.000880"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.588247" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.587659" elapsed="0.000711"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.589262" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.588781" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.588437" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.587618" elapsed="0.001822"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.589770" elapsed="0.000745"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:59.591391" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.590782" elapsed="0.000706"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.591745" elapsed="0.002499"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.575800" elapsed="0.018550"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.594591" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.594446" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.594427" elapsed="0.000303"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:59.598008" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:59.594870" elapsed="0.003169"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:59.598169" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:20:59.598330" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.553741" elapsed="0.044615"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.598412" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:59.598556" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.552996" elapsed="0.045587"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.599669" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.599173" elapsed="0.000524"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:59.599745" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.599922" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:59.598797" elapsed="0.001152"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.600342" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 670, 'CommittedTransactionsCount': 175, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.600137" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.600714" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.600518" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:59.600786" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:59.600933" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:59.399520" elapsed="0.201438"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:59.601030" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:59.601175" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:20:59.398790" elapsed="0.202409"/>
</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-07T17:20:59.601488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.601277" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:20:59.601795" elapsed="0.000280"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.601566" elapsed="0.000550"/>
</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-07T17:20:59.602282" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.602140" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.601260" elapsed="0.001096"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:20:59.398457" elapsed="0.203922"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.604876" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.604536" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:59.604947" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:20:59.605109" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.604203" elapsed="0.000930"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.653673" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.653289" elapsed="0.000457"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.654469" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.654256" elapsed="0.000277">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.654626" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.653909" elapsed="0.000744"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.655211" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.654814" elapsed="0.000424"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.655529" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:59.655660" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:59.655396" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.656094" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.655836" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.657215" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.656940" elapsed="0.000320"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.657696" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.657414" elapsed="0.000308"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.658046" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.658246" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.658412" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.657903" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.657771" elapsed="0.000726"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:59.658539" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.658695" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:59.656488" elapsed="0.002231"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.656205" elapsed="0.002545"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.658915" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.658774" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.656186" elapsed="0.002819"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.659563" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.659144" elapsed="0.000446"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.659637" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:59.652669" elapsed="0.007088"/>
</kw>
<msg time="2026-04-07T17:20:59.659809" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.640900" elapsed="0.019013"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.671464" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.683322" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.694880" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.695294" elapsed="0.000053"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.695668" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.696181" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.696041" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:59.696026" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.696396" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.696557" 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-07T17:20:59.696716" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.695996" elapsed="0.000772"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.695849" elapsed="0.000955"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.697121" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.697272" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.697460" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:59.635203" elapsed="0.062306"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.699834" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.699588" elapsed="0.000309">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.700114" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.699177" elapsed="0.000982"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.700622" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.700296" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.701271" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.700959" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.700756" elapsed="0.000599"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.700255" elapsed="0.001155"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.704104" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.701722" elapsed="0.002428"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:59.704244" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:59.704522" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.698355" elapsed="0.006216"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.706879" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.706633" elapsed="0.000307">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.707152" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.706225" elapsed="0.000970"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:59.707554" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.707335" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.707293" elapsed="0.000416"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.708130" elapsed="0.000057"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.708504" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.708648" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.710504" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.705387" elapsed="0.005166"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.714008" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.713666" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.714756" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.714428" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.738713" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.739130" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:20:59 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:59.739341" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.717077" elapsed="0.022291"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.714997" elapsed="0.024440"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.739698" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.739497" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.714942" elapsed="0.024897"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.744214" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.741306" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.741088" elapsed="0.003361"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.741068" elapsed="0.003406"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.746878" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.744748" elapsed="0.002175"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.744530" elapsed="0.002427"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.744512" elapsed="0.002484"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.747516" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.747150" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.747837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.747611" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.748381" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.748087" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.747918" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.747593" elapsed="0.000870"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.749015" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.748612" elapsed="0.000432"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.749340" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.749114" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.749916" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.749623" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.749444" elapsed="0.000547"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.749096" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.750156" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:59.750922" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.750652" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.751110" elapsed="0.002097"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.740528" elapsed="0.012827"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.753703" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.753511" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.753454" elapsed="0.000370"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:59.759783" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:59.754141" elapsed="0.005691"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:59.759927" elapsed="0.000077"/>
</return>
<msg time="2026-04-07T17:20:59.760227" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.711292" elapsed="0.048986"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.760494" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.760745" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.612855" elapsed="0.147917"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.761117" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.760855" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.760838" elapsed="0.000767"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.761639" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:59.608913" elapsed="0.152851"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.605200" elapsed="0.156606"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.605182" elapsed="0.156647"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.762466" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.762361" elapsed="0.000149"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:59.762630" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.762532" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.762343" elapsed="0.000366"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.762846" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:20:59.762963" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:59.762096" elapsed="0.000920"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.763541" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.763176" elapsed="0.000391"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.764195" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.763716" elapsed="0.000506"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.770182" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.769638" elapsed="0.000626"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.770953" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.770428" elapsed="0.000681"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.784514" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.784618" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:20:59 GMT', 'Expires': 'Tue, 07 Apr 2026 16:20:59 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":670,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":670,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"470.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582459,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:59.784768" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.775798" elapsed="0.009020"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.771192" elapsed="0.013859"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.785263" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.785083" elapsed="0.000405"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.771173" elapsed="0.014342"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.789596" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":670,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":670,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"470.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582459,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.787362" elapsed="0.002343"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.786840" elapsed="0.002933"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.786799" elapsed="0.003041"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.792668" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.790497" elapsed="0.002265"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.790023" elapsed="0.002805"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.789943" elapsed="0.002952"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.794320" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.793446" elapsed="0.000971"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.795060" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.794556" elapsed="0.000628"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.796085" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.795600" elapsed="0.000531"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.795251" elapsed="0.000948"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.794515" elapsed="0.001748"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.797611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.796806" elapsed="0.000903"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.798411" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.797847" elapsed="0.000686"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.799425" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.798944" elapsed="0.000525"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.798600" elapsed="0.000937"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.797806" elapsed="0.001795"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.799901" elapsed="0.000640"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:59.801420" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.800808" elapsed="0.000725"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.801791" elapsed="0.002439"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.785961" elapsed="0.018376"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.804575" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.804431" elapsed="0.000254"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.804412" elapsed="0.000298"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:59.808022" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:59.804850" elapsed="0.003202"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:59.808152" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.808309" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.765155" elapsed="0.043209"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.808423" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:20:59.808570" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.764426" elapsed="0.044170"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.809655" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.809156" elapsed="0.000527"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:20:59.809731" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.809902" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:20:59.808807" elapsed="0.001122"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.810421" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 670, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.810221" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:20:59.810793" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.810596" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:20:59.810863" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:20:59.811026" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:59.603587" elapsed="0.207464"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:20:59.811108" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:20:59.811252" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:59.602695" elapsed="0.208581"/>
</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="PASS" start="2026-04-07T17:20:59.811561" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.811354" elapsed="0.000432"/>
</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-07T17:20:59.811949" elapsed="0.000035"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.811811" 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-07T17:20:59.812179" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.812043" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.811337" elapsed="0.000914"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:20:59.602534" elapsed="0.209741"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.815813" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.815474" elapsed="0.000365"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:20:59.815884" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.816047" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:20:59.815139" elapsed="0.000933"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.864846" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.864472" elapsed="0.000402"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.865616" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.865376" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.865810" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.865048" elapsed="0.000786"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.866395" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.866010" elapsed="0.000412"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.866709" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:20:59.866838" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:20:59.866576" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.867270" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.867028" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.868398" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.867988" elapsed="0.000454"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.868862" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.868598" elapsed="0.000290"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.869212" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.869428" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.869595" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.869084" elapsed="0.000568"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.868936" elapsed="0.000745"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:20:59.869724" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.869880" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:20:59.867662" elapsed="0.002242"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.867382" elapsed="0.002553"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.870117" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.869959" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.867363" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.870750" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.870327" elapsed="0.000450"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.870824" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:20:59.863851" elapsed="0.007095"/>
</kw>
<msg time="2026-04-07T17:20:59.871015" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.851798" elapsed="0.019325"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.882881" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.894537" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.906196" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.906595" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.906999" elapsed="0.000056"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.907500" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.907360" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:20:59.907344" elapsed="0.000236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.907714" 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-07T17:20:59.907875" 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-07T17:20:59.908052" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:20:59.907315" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.907183" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.908440" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.908592" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.908782" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:20:59.846229" elapsed="0.062603"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.911151" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.910894" elapsed="0.000320">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.911403" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.910482" elapsed="0.000964"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.911915" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.911586" elapsed="0.000465"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.912618" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.912319" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.912110" elapsed="0.000593"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.911544" elapsed="0.001213"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.915270" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:20:59.913073" elapsed="0.002242"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:20:59.915410" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:20:59.915691" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.909676" elapsed="0.006063"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:20:59.918057" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:20:59.917801" elapsed="0.000319">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:20:59.918349" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:20:59.917391" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:20:59.918748" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.918531" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.918489" elapsed="0.000418"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.919220" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.919595" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.919740" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:20:59.921877" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:20:59.916569" elapsed="0.005357"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.925438" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.925085" elapsed="0.000449"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.926204" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.925855" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.949581" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.949994" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Set-Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0; Path=/rests; HttpOnly, rememberMe=deleteMe; Path=/rests; Max-Age=0; Expires=Mon, 06-Apr-2026 17:20:59 GMT; SameSite=lax', 'Expires': 'Thu, 01 Jan 1970 00:00:00 GMT', 'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:20:59.950275" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.928518" elapsed="0.021785"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.926433" elapsed="0.023940"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.950635" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.950434" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.926392" elapsed="0.024386"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.954773" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.952266" elapsed="0.002905"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.952048" elapsed="0.003162"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.952027" elapsed="0.003208"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.957661" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.955511" elapsed="0.002196"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.955292" elapsed="0.002449"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.955275" elapsed="0.002490"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.958307" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.957920" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.958630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.958403" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.959178" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.958863" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.958712" elapsed="0.000527"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.958385" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.959771" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.959414" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.960156" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.959893" elapsed="0.000322"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.960682" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.960390" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.960238" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.959848" elapsed="0.000916"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:20:59.960907" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:20:59.961706" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.961435" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:20:59.961880" elapsed="0.002102"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.951479" elapsed="0.012654"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.964465" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.964273" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.964232" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:20:59.970819" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:20:59.964881" elapsed="0.005987"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:20:59.970980" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:20:59.971273" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.922672" elapsed="0.048652"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.971544" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:20:59.971800" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.823812" elapsed="0.148015"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.972176" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.971910" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.971892" elapsed="0.000795"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:20:59.972721" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:20:59.819883" elapsed="0.152962"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.816140" elapsed="0.156748"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.816122" elapsed="0.156789"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:20:59.973571" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:20:59.973465" elapsed="0.000150"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:20:59.973735" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:20:59.973636" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.973448" elapsed="0.000366"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.973953" elapsed="0.000041"/>
</kw>
<msg time="2026-04-07T17:20:59.974093" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:20:59.973182" elapsed="0.000935"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.974644" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:20:59.974277" elapsed="0.000393"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.975289" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:20:59.974818" elapsed="0.000498"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.981124" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.980573" elapsed="0.000632"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:20:59.981914" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.981383" elapsed="0.000699"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:20:59.995018" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:20:59.995121" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Follower","LastApplied":670,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":670,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"419.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582460,"status":200} 
 </msg>
<msg time="2026-04-07T17:20:59.995269" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:20:59.986735" elapsed="0.008582"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.982168" elapsed="0.013300"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:20:59.995670" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:20:59.995496" elapsed="0.000377"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.982148" elapsed="0.013750"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.000167" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":669,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":669,"Leader":"member-1-shard-topology-operational","LastIndex":670,"RaftState":"Follower","LastApplied":670,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":670,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"419.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":670,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":184528},"timestamp":1775582460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:20:59.997776" elapsed="0.002501"/>
</kw>
<status status="PASS" start="2026-04-07T17:20:59.997241" elapsed="0.003105"/>
</branch>
<status status="PASS" start="2026-04-07T17:20:59.997200" elapsed="0.003214"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.003230" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.001049" elapsed="0.002275"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.000558" elapsed="0.002834"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.000518" elapsed="0.002942"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.004873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.004090" elapsed="0.000895"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.005633" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.005127" elapsed="0.000630"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.006660" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.006188" elapsed="0.000518"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.005824" elapsed="0.000950"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.005086" elapsed="0.001753"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.008223" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.007391" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.008946" elapsed="0.000071"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.008458" elapsed="0.000629"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.010006" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.009525" elapsed="0.000527"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.009153" elapsed="0.000968"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.008416" elapsed="0.001769"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.010488" elapsed="0.000641"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.012061" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.011398" elapsed="0.000762"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.012419" elapsed="0.002378"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:20:59.996359" elapsed="0.018545"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.015168" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.015020" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.014999" elapsed="0.000305"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.018583" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.015446" elapsed="0.003167"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.018713" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:00.018870" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:20:59.976247" elapsed="0.042680"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.019003" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.019153" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:20:59.975520" elapsed="0.043658"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.020355" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.019727" elapsed="0.000657"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:00.020433" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.020607" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755824...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:00.019393" elapsed="0.001241"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.020995" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 670, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.020784" elapsed="0.000240"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.021398" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.021175" elapsed="0.000248"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:00.021470" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.021617" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:20:59.814530" elapsed="0.207112"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:00.021697" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.021840" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:20:59.812590" elapsed="0.209273"/>
</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="PASS" start="2026-04-07T17:21:00.022165" elapsed="0.000187"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.021940" elapsed="0.000450"/>
</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-07T17:21:00.022554" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.022414" 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-07T17:21:00.022763" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.022630" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.021922" elapsed="0.000913"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:20:59.812429" elapsed="0.210429"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:20:59.398262" elapsed="0.624625"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.022926" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.023139" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:00.023185" level="INFO">${follower_list} = [2, 3]</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-07T17:20:59.394326" elapsed="0.628882"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.023644" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:00.023718" level="INFO">${leader_count} = 1</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-07T17:21:00.023377" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.024090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.023810" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.023792" elapsed="0.000377"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.026256" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:00.024300" elapsed="0.002003"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:00.026687" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.026500" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.026759" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:20:59.391870" elapsed="0.635040"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:20:59.391653" elapsed="0.635303"/>
</iter>
<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-07T17:21:00.031223" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.030829" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.031700" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.031403" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:00.031769" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.031920" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.030464" elapsed="0.001480"/>
</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-07T17:21:00.032108" elapsed="0.000152"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.032738" 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-07T17:21:00.032413" elapsed="0.000351"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.033170" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.032913" elapsed="0.000282"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.033592" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.033360" elapsed="0.000257"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.036064" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.035702" elapsed="0.000389"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:00.036136" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.036281" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:00.035365" elapsed="0.000940"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.085112" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.084726" elapsed="0.000414"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.085859" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.085637" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.086028" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.085310" elapsed="0.000742"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.086588" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.086210" elapsed="0.000405"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.086902" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:00.087059" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:00.086770" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.087520" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.087277" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.088495" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.088245" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.088953" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.088693" elapsed="0.000301"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.089325" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.089525" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.089692" elapsed="0.000020"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.089174" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.089042" elapsed="0.000735"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:00.089818" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.089988" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:00.087913" elapsed="0.002101"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.087631" elapsed="0.002416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.090214" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.090071" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.087612" elapsed="0.002676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.090850" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.090426" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.090924" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.084124" elapsed="0.006940"/>
</kw>
<msg time="2026-04-07T17:21:00.091115" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.072214" elapsed="0.019009"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.103163" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.114791" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.126381" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.126773" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.127174" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.127670" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.127531" elapsed="0.000239"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:00.127516" elapsed="0.000278"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.127933" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.128116" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.128277" elapsed="0.000025"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.127486" elapsed="0.000850"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.127356" elapsed="0.001017"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.128670" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.128822" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.129036" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:00.066630" elapsed="0.062457"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.131399" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.131160" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.131652" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.130731" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.132218" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.131839" elapsed="0.000458"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.132857" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.132561" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.132353" elapsed="0.000588"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.131798" elapsed="0.001216"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.135496" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.133328" elapsed="0.002214"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:00.135637" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:00.135918" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.129915" elapsed="0.006105"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.138289" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.138050" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.138542" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.137628" elapsed="0.000959"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:00.138944" elapsed="0.000042"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.138725" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.138684" elapsed="0.000435"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.139416" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.139790" elapsed="0.000054"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.139934" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.142057" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.136787" elapsed="0.005322"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.145614" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.145290" elapsed="0.000420"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.146369" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.146045" elapsed="0.000418"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.161732" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.162142" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:00.162335" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.148698" elapsed="0.013664"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.146596" elapsed="0.015833"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.162686" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.162488" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.146555" elapsed="0.016269"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.166762" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.164279" elapsed="0.002706"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.164060" elapsed="0.002961"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.164039" elapsed="0.003007"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.169460" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.167318" elapsed="0.002187"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.167102" elapsed="0.002437"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.167085" elapsed="0.002478"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.170100" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.169715" elapsed="0.000411"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.170422" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.170195" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.170984" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.170673" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.170517" elapsed="0.000529"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.170177" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.171576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.171219" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.171894" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.171671" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.172474" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.172183" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.172026" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.171653" elapsed="0.000902"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.172694" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.173494" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.173223" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.173665" elapsed="0.002162"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.163506" elapsed="0.012496"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.176337" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.176146" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.176104" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.182590" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.176753" elapsed="0.005886"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.182735" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:00.183036" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.142871" elapsed="0.040216"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.183304" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.183554" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.044138" elapsed="0.139443"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.183909" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.183663" elapsed="0.000689"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.183646" elapsed="0.000734"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.184414" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:00.040206" elapsed="0.144332"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.036372" elapsed="0.148209"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.036354" elapsed="0.148250"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.185292" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.185172" elapsed="0.000165"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:00.185457" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.185359" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.185154" elapsed="0.000382"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.185675" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:21:00.185793" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:00.184855" elapsed="0.000963"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.186359" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.185993" elapsed="0.000392"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.186999" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.186534" elapsed="0.000493"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.192850" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.192324" elapsed="0.000607"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.193708" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.193108" elapsed="0.000679"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.204980" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.205086" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":34,"SnapshotIndex":167,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":167,"Leader":"member-1-shard-default-operational","LastIndex":169,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":168,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":169,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.207","active":true,"matchIndex":168,"voting":true,"id":"member-3-shard-default-operational","nextIndex":169},{"timeSinceLastActivity":"00:00:00.206","active":true,"matchIndex":168,"voting":true,"id":"member-2-shard-default-operational","nextIndex":169}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"515.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":168,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":50,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54607},"timestamp":1775582460,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:00.205252" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.198480" elapsed="0.006822"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.193870" elapsed="0.011584"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.205658" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.205483" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.193851" elapsed="0.012069"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.210180" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":34,"SnapshotIndex":167,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":167,"Leader":"member-1-shard-default-operational","LastIndex":169,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":168,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":169,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.207","active":true,"matchIndex":168,"voting":true,"id":"member-3-shard-default-operational","nextIndex":169},{"timeSinceLastActivity":"00:00:00.206","active":true,"matchIndex":168,"voting":true,"id":"member-2-shard-default-operational","nextIndex":169}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"515.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":168,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":50,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54607},"timestamp":1775582460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.207797" elapsed="0.002494"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.207320" elapsed="0.003040"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.207278" elapsed="0.003149"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.213234" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.211061" elapsed="0.002268"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.210569" elapsed="0.002829"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.210528" elapsed="0.002937"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.214788" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.214017" elapsed="0.000867"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.215587" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.215098" elapsed="0.000613"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.216611" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.216141" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.215779" elapsed="0.000947"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.215054" elapsed="0.001737"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.218141" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.217353" elapsed="0.000886"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.218865" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.218376" elapsed="0.000698"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.219953" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.219487" elapsed="0.000526"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.219142" elapsed="0.000940"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.218335" elapsed="0.001810"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.220444" elapsed="0.000632"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.221965" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.221369" elapsed="0.000711"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.222337" elapsed="0.002456"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.206388" elapsed="0.018512"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.225171" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.225011" elapsed="0.000271"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.224991" elapsed="0.000316"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.228577" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.225448" elapsed="0.003158"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.228734" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:00.228893" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.187940" elapsed="0.040979"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.229084" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.229250" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.187231" elapsed="0.042045"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.230325" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.229817" elapsed="0.000536"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:00.230401" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.230578" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:00.229488" elapsed="0.001116"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.230954" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 168, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.230753" elapsed="0.000355"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.231460" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.231262" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:00.231531" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:00.231678" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:00.034731" elapsed="0.196971"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:00.231758" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.231901" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:00.034033" elapsed="0.197892"/>
</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-07T17:21:00.232226" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.232017" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:21:00.232505" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.232306" elapsed="0.000422"/>
</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-07T17:21:00.232891" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.232752" elapsed="0.000190"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.231999" elapsed="0.000966"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:00.033857" elapsed="0.199149"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.235395" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.235054" elapsed="0.000368"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:00.235467" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.235612" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:00.234656" elapsed="0.000980"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.284147" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.283758" elapsed="0.000417"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.284949" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.284705" elapsed="0.000324">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.285145" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.284375" elapsed="0.000797"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.285710" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.285331" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.286040" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:00.286172" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:00.285890" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.286585" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.286348" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.287556" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.287306" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.288021" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.287751" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.288353" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.288548" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.288713" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.288226" elapsed="0.000544"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.288095" elapsed="0.000703"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:00.288839" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.289009" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:00.286990" elapsed="0.002045"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.286696" elapsed="0.002371"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.289248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.289092" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.286677" elapsed="0.002648"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.289878" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.289460" elapsed="0.000445"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.289951" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.283161" elapsed="0.006927"/>
</kw>
<msg time="2026-04-07T17:21:00.290140" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.271423" elapsed="0.018823"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.302998" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.315239" elapsed="0.000063"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.326846" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.327261" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.327639" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.328158" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.328016" elapsed="0.000199"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:00.328000" 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-07T17:21:00.328372" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.328534" 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-07T17:21:00.328694" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.327954" elapsed="0.000793"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.327821" elapsed="0.000962"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.329111" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.329266" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.329457" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:00.265751" elapsed="0.063755"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.331813" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.331570" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.332095" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.331151" elapsed="0.000990"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.332606" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.332279" elapsed="0.000409"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.333297" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.332954" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.332747" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.332238" elapsed="0.001199"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.335921" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.333740" elapsed="0.002284"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:00.336123" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:00.336405" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.330341" elapsed="0.006113"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.338748" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.338511" elapsed="0.000299">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.339021" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.338101" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:00.339427" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.339207" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.339164" elapsed="0.000421"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.339887" elapsed="0.000056"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.340392" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.340535" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.342531" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.337286" elapsed="0.005295"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.346077" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.345733" elapsed="0.000438"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.346822" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.346495" elapsed="0.000420"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.364888" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.365319" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:00.365548" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.349176" elapsed="0.016399"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.347067" elapsed="0.018577"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.365909" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.365709" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.347025" elapsed="0.019049"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.370016" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.367519" elapsed="0.002705"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.367302" elapsed="0.002958"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.367281" elapsed="0.003004"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.372811" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.370562" elapsed="0.002294"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.370341" elapsed="0.002551"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.370324" elapsed="0.002592"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.373483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.373110" elapsed="0.000400"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.373809" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.373580" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.374357" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.374061" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.373891" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.373562" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.374952" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.374593" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.375335" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.375107" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.375859" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.375567" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.375416" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.375089" elapsed="0.000852"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.376099" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.376868" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.376595" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.377071" elapsed="0.002114"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.366743" elapsed="0.012593"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.379666" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.379476" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.379434" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.385793" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.380107" elapsed="0.005734"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.385943" elapsed="0.000099"/>
</return>
<msg time="2026-04-07T17:21:00.386283" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.343320" elapsed="0.043014"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.386554" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.386810" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.243437" elapsed="0.143400"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.387200" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.386920" elapsed="0.000749"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.386903" elapsed="0.000796"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.387733" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:00.239548" elapsed="0.148311"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.235702" elapsed="0.152200"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.235685" elapsed="0.152240"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.388564" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.388457" elapsed="0.000152"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:00.388731" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.388632" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.388440" elapsed="0.000371"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.388951" elapsed="0.000048"/>
</kw>
<msg time="2026-04-07T17:21:00.389113" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:00.388194" elapsed="0.000944"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.389664" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.389300" elapsed="0.000390"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.390318" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.389840" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.396501" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.395957" elapsed="0.000675"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.397391" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.396799" elapsed="0.000672"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.410221" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.410326" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":167,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":167,"Leader":"member-1-shard-default-operational","LastIndex":168,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":168,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":168,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"296.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":168,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54566},"timestamp":1775582460,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:00.410487" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.402174" elapsed="0.008362"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.397554" elapsed="0.013137"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.410900" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.410723" elapsed="0.000409"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.397535" elapsed="0.013623"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.416027" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":167,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":167,"Leader":"member-1-shard-default-operational","LastIndex":168,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":168,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":168,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"296.0 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":168,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54566},"timestamp":1775582460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.413012" elapsed="0.003171"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.412485" elapsed="0.003794"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.412444" elapsed="0.003929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.420403" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.417275" elapsed="0.003258"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.416572" elapsed="0.004055"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.416516" elapsed="0.004204"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.422605" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.421507" elapsed="0.001233"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.423635" elapsed="0.000076"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.422932" elapsed="0.000877"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.425187" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.424467" elapsed="0.000784"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.423901" elapsed="0.001448"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.422874" elapsed="0.002566"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.426886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.426114" elapsed="0.000885"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.427629" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.427139" elapsed="0.000619"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.428669" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.428197" elapsed="0.000517"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.427825" elapsed="0.000958"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.427098" elapsed="0.001750"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.429179" elapsed="0.000629"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.430701" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.430093" elapsed="0.000722"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.431089" elapsed="0.002607"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.411602" elapsed="0.022200"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.434061" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.433897" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.433878" elapsed="0.000320"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.437515" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.434338" elapsed="0.003206"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.437645" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:00.437802" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.391500" elapsed="0.046329"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.437918" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.438085" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.390719" elapsed="0.047392"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.439156" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.438659" elapsed="0.000526"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:00.439233" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.439404" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:00.438327" elapsed="0.001103"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.439775" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 168, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.439579" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.440244" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.439951" elapsed="0.000319"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:00.440315" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.440463" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:00.234065" elapsed="0.206422"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:00.440543" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.440684" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:00.233348" elapsed="0.207360"/>
</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="PASS" start="2026-04-07T17:21:00.441018" elapsed="0.000195"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.440785" elapsed="0.000466"/>
</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-07T17:21:00.441414" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.441275" 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-07T17:21:00.441626" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.441491" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.440768" elapsed="0.000930"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:00.233185" elapsed="0.208536"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.444096" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.443701" elapsed="0.000422"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:00.444167" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.444311" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:00.443368" elapsed="0.000967"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.493179" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.492768" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.493898" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.493688" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.494108" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.493364" elapsed="0.000768"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.494673" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.494292" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.495002" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:00.495136" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:00.494854" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.495553" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.495314" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.496532" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.496280" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.497021" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.496728" elapsed="0.000319"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.497359" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.497557" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.497725" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.497231" elapsed="0.000551"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.497097" elapsed="0.000714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:00.497853" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.498025" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:00.495946" elapsed="0.002104"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.495663" elapsed="0.002419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.498248" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.498106" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.495644" elapsed="0.002681"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.498885" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.498461" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.498960" elapsed="0.000043"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.492164" elapsed="0.006935"/>
</kw>
<msg time="2026-04-07T17:21:00.499152" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.480239" elapsed="0.019020"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.511180" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.523027" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.534725" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.535141" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.535520" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.536036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.535880" elapsed="0.000215"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:00.535864" elapsed="0.000254"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.536253" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.536415" 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-07T17:21:00.536574" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.535835" elapsed="0.000791"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.535701" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.536985" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.537140" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:00.537329" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:00.474649" elapsed="0.062729"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.539664" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.539423" elapsed="0.000304">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.539923" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.539010" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.540466" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.540138" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.541146" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.540806" elapsed="0.000366"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.540601" elapsed="0.000630"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.540097" elapsed="0.001189"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.543768" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.541584" elapsed="0.002230"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:00.543910" elapsed="0.000122"/>
</return>
<msg time="2026-04-07T17:21:00.544258" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.538206" elapsed="0.006101"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.546721" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.546482" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.547028" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.546070" elapsed="0.001002"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:00.547432" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.547212" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.547171" elapsed="0.000417"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.547888" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.548386" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.548528" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.550537" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.545260" elapsed="0.005327"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.554059" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.553718" elapsed="0.000434"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.554793" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.554472" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.568664" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.569248" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:00.569526" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.557138" elapsed="0.012425"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.555038" elapsed="0.014620"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.570046" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.569741" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.554994" elapsed="0.015252"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.575791" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.572287" elapsed="0.003811"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.571957" elapsed="0.004191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.571929" elapsed="0.004253"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.579575" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.576565" elapsed="0.003071"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.576261" elapsed="0.003424"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.576236" elapsed="0.003483"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.580469" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.579934" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.580941" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.580603" elapsed="0.000452"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.581732" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.581312" elapsed="0.000456"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.581093" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.580577" elapsed="0.001271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.582706" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.582079" elapsed="0.000665"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.583081" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.582832" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.583606" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.583316" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.583164" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.582814" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.583829" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.584610" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.584342" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.584783" elapsed="0.002124"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.571203" elapsed="0.015873"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.587469" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.587216" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.587174" elapsed="0.000418"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.593722" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.587887" elapsed="0.005885"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.593869" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:00.594216" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.551330" elapsed="0.042937"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.594488" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.594748" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.452224" elapsed="0.142551"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.595120" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.594858" elapsed="0.000728"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.594841" elapsed="0.000774"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.595648" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:00.448279" elapsed="0.147494"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.444401" elapsed="0.151414"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.444384" elapsed="0.151454"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.596481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.596376" elapsed="0.000149"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:00.596645" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.596547" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.596358" elapsed="0.000366"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.596862" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:21:00.597008" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:00.596110" elapsed="0.000924"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.597557" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.597194" elapsed="0.000389"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.598214" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.597736" elapsed="0.000505"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.604141" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.603590" elapsed="0.000634"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.604945" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.604389" elapsed="0.000654"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.615215" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.615358" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":171,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":171,"Leader":"member-1-shard-default-operational","LastIndex":172,"RaftState":"Follower","LastApplied":172,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":172,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"187.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":172,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54730},"timestamp":1775582460,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:00.615568" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.609850" elapsed="0.005788"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.605127" elapsed="0.010728"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.616405" elapsed="0.000067"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.615894" elapsed="0.000810"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.605108" elapsed="0.011631"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.622724" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":171,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":171,"Leader":"member-1-shard-default-operational","LastIndex":172,"RaftState":"Follower","LastApplied":172,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":172,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"187.0 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":172,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":54730},"timestamp":1775582460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.619370" elapsed="0.003509"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.618635" elapsed="0.004359"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.618576" elapsed="0.004520"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.626880" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.623985" elapsed="0.003006"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.623297" elapsed="0.003765"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.623240" elapsed="0.003891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.628473" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.627676" elapsed="0.000896"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.629239" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.628713" elapsed="0.000650"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.630321" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.629788" elapsed="0.000579"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.629430" elapsed="0.001006"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.628670" elapsed="0.001830"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.631839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.631060" elapsed="0.000877"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.632588" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.632092" elapsed="0.000620"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.633633" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.633163" elapsed="0.000515"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.632780" elapsed="0.000967"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.632051" elapsed="0.001759"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.634130" elapsed="0.000621"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.635628" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.635032" elapsed="0.000697"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.636003" elapsed="0.002516"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.617400" elapsed="0.021226"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.638868" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.638726" elapsed="0.000266"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.638705" elapsed="0.000315"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.642352" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.639161" elapsed="0.003220"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.642479" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.642634" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.599178" elapsed="0.043482"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.642749" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.642899" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.598445" elapsed="0.044479"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.643982" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.643487" elapsed="0.000525"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:00.644060" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.644232" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558246...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:00.643153" elapsed="0.001105"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.644601" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 172, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.644406" elapsed="0.000222"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.645003" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.644775" elapsed="0.000254"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:00.645074" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.645221" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:00.442759" elapsed="0.202486"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:00.645300" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.645443" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:00.442053" elapsed="0.203413"/>
</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="PASS" start="2026-04-07T17:21:00.645750" elapsed="0.000186"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.645543" elapsed="0.000455"/>
</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-07T17:21:00.646164" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.646024" 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-07T17:21:00.646374" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.646241" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.645526" elapsed="0.000921"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:00.441876" elapsed="0.204594"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.033663" elapsed="0.612835"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.646537" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:00.646732" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:00.646777" level="INFO">${follower_list} = [2, 3]</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-07T17:21:00.029745" elapsed="0.617055"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.647246" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:00.647321" level="INFO">${leader_count} = 1</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-07T17:21:00.646980" elapsed="0.000365"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.647619" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.647412" elapsed="0.000260"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.647395" elapsed="0.000300"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.649723" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:00.647822" elapsed="0.001947"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:00.650226" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.649964" elapsed="0.000287"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.650299" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:21:00.027270" elapsed="0.623181"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:21:00.027054" elapsed="0.623443"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:20:59.391525" elapsed="1.259003"/>
</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="PASS" start="2026-04-07T17:20:59.391141" elapsed="1.259442"/>
</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-07T17:21:00.655447" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.655068" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.655926" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.655627" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:00.656010" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.656163" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.654690" 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-07T17:21:00.656335" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.657002" 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-07T17:21:00.656638" elapsed="0.000390"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.657417" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.657181" elapsed="0.000261"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.657821" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:00.657583" elapsed="0.000263"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.660253" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.659900" elapsed="0.000379"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:00.660324" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.660469" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:00.659567" elapsed="0.000926"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.709261" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.708871" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.710002" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.709770" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.710160" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.709446" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.710722" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.710342" elapsed="0.000406"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.711060" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:00.711240" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:00.710904" elapsed="0.000361"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.711661" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.711418" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.712640" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.712390" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.713127" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.712850" elapsed="0.000303"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.713458" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.713654" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.713821" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.713330" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.713200" elapsed="0.000708"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:00.713949" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:00.714122" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:00.712073" elapsed="0.002073"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.711774" elapsed="0.002403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.714344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.714202" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.711755" elapsed="0.002664"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.714989" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.714556" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.715065" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.708238" elapsed="0.006948"/>
</kw>
<msg time="2026-04-07T17:21:00.715237" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.696371" elapsed="0.018973"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.727210" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.738879" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.750449" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.750875" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.751278" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.751776" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.751636" elapsed="0.000195"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:00.751622" elapsed="0.000233"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.752004" 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-07T17:21:00.752169" 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-07T17:21:00.752329" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.751592" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.751459" elapsed="0.000958"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.752714" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.752878" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.753084" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:00.690812" elapsed="0.062321"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.755417" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.755177" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.755669" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.754749" elapsed="0.000969"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.756221" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.755855" elapsed="0.000445"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.756885" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.756564" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.756357" elapsed="0.000626"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.755814" elapsed="0.001227"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.759514" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.757340" elapsed="0.002222"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:00.759656" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:00.759934" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.753944" elapsed="0.006100"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.762295" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.762057" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.762549" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.761635" elapsed="0.000958"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:00.762948" elapsed="0.000047"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.762731" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.762689" elapsed="0.000439"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.763424" elapsed="0.000054"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.763835" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.764093" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:00.766930" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.760826" elapsed="0.006168"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.770471" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.770143" elapsed="0.000422"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.771227" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.770887" elapsed="0.000433"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.781371" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.781917" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:00.782221" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.773546" elapsed="0.008713"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.771455" elapsed="0.010897"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.782713" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.782434" elapsed="0.000398"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.771414" elapsed="0.011494"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.788508" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.784959" elapsed="0.003858"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.784639" elapsed="0.004229"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.784610" elapsed="0.004292"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.792325" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.789342" elapsed="0.003045"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.789035" elapsed="0.003400"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.788956" elapsed="0.003512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.793240" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.792684" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.793697" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.793374" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.794458" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.794043" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.793809" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.793348" elapsed="0.001225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.795458" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.794923" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.795905" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.795592" elapsed="0.000413"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.796661" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.796255" elapsed="0.000442"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.796040" elapsed="0.000706"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.795566" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.797013" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.798118" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.797713" elapsed="0.000441"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.798359" elapsed="0.002976"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.783853" elapsed="0.017633"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.801816" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.801625" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.801584" elapsed="0.000355"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.807855" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.802259" elapsed="0.005645"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.808017" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:21:00.808309" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.767721" elapsed="0.040639"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.808581" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.808866" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.668364" elapsed="0.140529"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.809243" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.808992" elapsed="0.000702"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.808960" elapsed="0.000763"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.809758" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:00.664431" elapsed="0.145451"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.660560" elapsed="0.149364"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.660542" elapsed="0.149406"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:00.810605" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.810500" elapsed="0.000163"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.810723" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.810687" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.810483" elapsed="0.000301"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.810922" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:21:00.811071" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:00.810237" elapsed="0.000860"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.811741" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.811371" elapsed="0.000397"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.812395" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.811919" elapsed="0.000503"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.818440" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.817885" elapsed="0.000637"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.819311" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.818686" elapsed="0.000705"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.830396" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.830500" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:00 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:00 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":23,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":121,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":121,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.317","active":true,"matchIndex":121,"voting":true,"id":"member-2-shard-topology-config","nextIndex":122},{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":121,"voting":true,"id":"member-3-shard-topology-config","nextIndex":122}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"465.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":38,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582460,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:00.830676" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.824284" elapsed="0.006464"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.819474" elapsed="0.011543"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.831308" elapsed="0.000065"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.831059" elapsed="0.000540"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.819455" elapsed="0.012179"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.837684" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":23,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":121,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":121,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.317","active":true,"matchIndex":121,"voting":true,"id":"member-2-shard-topology-config","nextIndex":122},{"timeSinceLastActivity":"00:00:00.318","active":true,"matchIndex":121,"voting":true,"id":"member-3-shard-topology-config","nextIndex":122}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"465.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":38,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582460,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.834432" elapsed="0.003408"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.833749" elapsed="0.004185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.833690" elapsed="0.004361"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.842009" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.838920" elapsed="0.003186"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.838254" elapsed="0.003919"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.838197" elapsed="0.004044"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.843577" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.842780" elapsed="0.000894"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.844389" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.843818" elapsed="0.000696"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.845439" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.844949" elapsed="0.000536"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.844581" elapsed="0.000973"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.843776" elapsed="0.001843"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.846979" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.846181" elapsed="0.000901"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.847714" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.847220" elapsed="0.000618"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.848805" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.848321" elapsed="0.000530"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.847906" elapsed="0.001013"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.847178" elapsed="0.001823"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.849307" elapsed="0.000632"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:00.850833" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.850226" elapsed="0.000706"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.851229" elapsed="0.002490"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.832488" elapsed="0.021337"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.854091" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:00.853922" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.853903" elapsed="0.000326"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:00.857619" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:00.854371" elapsed="0.003278"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:00.857749" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:00.857942" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.813564" elapsed="0.044419"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.858043" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:00.858192" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.812631" elapsed="0.045586"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.859272" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582460, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.858762" elapsed="0.000539"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:00.859349" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.859524" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582460, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:00.858430" elapsed="0.001121"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.859906" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 121, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.859705" elapsed="0.000228"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:00.860408" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.860208" elapsed="0.000225"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:00.860480" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:00.860626" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:00.658960" elapsed="0.201690"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:00.860706" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:21:00.860866" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:00.658264" elapsed="0.202626"/>
</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-07T17:21:00.861193" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.860982" 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="PASS" start="2026-04-07T17:21:00.861660" elapsed="0.000192"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.861447" elapsed="0.000444"/>
</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-07T17:21:00.862075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.861916" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.860951" elapsed="0.001203"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:00.658103" elapsed="0.204074"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.864533" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.864194" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:00.864605" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.864779" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:00.863804" elapsed="0.001001"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.913400" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.913025" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.914230" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.913980" elapsed="0.000315">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.914388" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.913585" elapsed="0.000827"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.914951" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.914572" elapsed="0.000427"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.915292" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:00.915461" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:00.915157" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.915882" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.915640" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.916886" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.916613" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.917359" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:00.917101" elapsed="0.000284"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.917688" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.917885" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.918066" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.917562" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.917432" elapsed="0.000720"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:00.918194" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:00.918348" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:00.916299" elapsed="0.002074"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.916016" elapsed="0.002388"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.918569" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.918428" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.915995" elapsed="0.002649"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.919215" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:00.918781" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:00.919290" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:00.912384" elapsed="0.007028"/>
</kw>
<msg time="2026-04-07T17:21:00.919464" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:00.900460" elapsed="0.019111"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.931441" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.943207" elapsed="0.000062"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.955070" elapsed="0.000062"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.955470" elapsed="0.000056"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.955852" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.956376" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.956235" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:00.956221" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.956591" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.956775" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.956938" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:00.956191" elapsed="0.000818"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.956058" elapsed="0.000988"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.957347" elapsed="0.000055"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.957502" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:00.957692" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:00.894844" elapsed="0.062898"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.960086" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.959828" elapsed="0.000321">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.960340" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.959400" elapsed="0.000985"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.960862" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.960522" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.961565" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:00.961267" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.961059" elapsed="0.000589"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.960482" elapsed="0.001221"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.964185" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:00.962017" elapsed="0.002213"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:00.964324" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:00.964602" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.958582" elapsed="0.006069"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:00.967007" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:00.966752" elapsed="0.000319">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:00.967263" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:00.966342" elapsed="0.000965"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:00.967662" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:00.967444" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.967404" elapsed="0.000416"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.968133" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.968508" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:00.968677" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:21:00.970629" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:00.965498" elapsed="0.005181"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.974171" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.973826" elapsed="0.000440"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:00.974908" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.974586" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:00.990639" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:00.991545" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:00.992048" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:00.977390" elapsed="0.014720"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.975152" elapsed="0.017112"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:00.992870" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:00.992398" elapsed="0.000703"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.975111" elapsed="0.018111"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.001992" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:00.996522" elapsed="0.005678"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.996032" elapsed="0.006204"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.995960" elapsed="0.006302"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.005267" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.002539" elapsed="0.002776"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.002319" elapsed="0.003031"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.002301" elapsed="0.003073"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.006144" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.005737" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.006474" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.006242" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.007030" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.006711" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.006557" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.006224" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.007627" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.007267" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.007950" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.007723" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.008496" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.008204" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.008048" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.007704" elapsed="0.000873"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.008744" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.009538" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.009262" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.009712" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:00.994766" elapsed="0.017231"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.012330" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.012140" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.012099" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.018380" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.012761" elapsed="0.005667"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.018524" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:21:01.018812" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:00.971420" elapsed="0.047442"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.019098" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.019353" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:00.872490" elapsed="0.146890"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.019713" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.019464" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.019446" elapsed="0.000759"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.020239" elapsed="0.000028"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:00.868579" elapsed="0.151785"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:00.864873" elapsed="0.155533"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:00.864855" elapsed="0.155575"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:01.021148" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.021041" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.021268" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.021231" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.021021" elapsed="0.000308"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.021469" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:21:01.021586" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:01.020723" elapsed="0.000888"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.022158" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.021775" elapsed="0.000410"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.022824" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.022336" elapsed="0.000516"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.029125" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.028535" elapsed="0.000673"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.029908" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.029374" elapsed="0.000630"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.041257" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.041412" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":121,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":121,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"274.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582461,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:01.041632" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.034867" elapsed="0.006839"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.030089" elapsed="0.011844"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.042268" elapsed="0.000069"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.042002" elapsed="0.000576"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.030070" elapsed="0.012545"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.048793" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":121,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":121,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"274.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.045370" elapsed="0.003657"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.044638" elapsed="0.004492"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.044560" elapsed="0.004672"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.052303" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.050054" elapsed="0.002345"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.049443" elapsed="0.003024"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.049384" elapsed="0.003151"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.053896" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.053112" elapsed="0.000899"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.054649" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.054155" elapsed="0.000620"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.055700" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.055225" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.054843" elapsed="0.000974"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.054112" elapsed="0.001771"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.057296" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.056484" elapsed="0.000911"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.058046" elapsed="0.000058"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.057536" elapsed="0.000638"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.059099" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.058596" elapsed="0.000550"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.058242" elapsed="0.000973"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.057494" elapsed="0.001788"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.059589" elapsed="0.000746"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.061237" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.060625" elapsed="0.000709"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.061592" elapsed="0.002531"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.043312" elapsed="0.020921"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.064472" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.064330" elapsed="0.000252"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.064311" elapsed="0.000310"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.067763" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.064767" elapsed="0.003025"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.067890" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:01.068154" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.023796" elapsed="0.044385"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.068272" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.068422" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.023074" elapsed="0.045374"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.069503" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.069023" elapsed="0.000508"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:01.069579" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.069749" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:01.068675" elapsed="0.001101"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.070142" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 121, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.069926" elapsed="0.000243"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.070516" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.070319" elapsed="0.000222"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:01.070587" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.070735" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:00.863214" elapsed="0.207545"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:01.070815" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:01.070959" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:00.862491" elapsed="0.208519"/>
</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="PASS" start="2026-04-07T17:21:01.071299" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.071090" elapsed="0.000437"/>
</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-07T17:21:01.071692" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.071551" 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-07T17:21:01.071904" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.071769" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.071072" elapsed="0.000963"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:00.862330" elapsed="0.209730"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.074578" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.074239" elapsed="0.000366"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:01.074649" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.074794" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:01.073888" elapsed="0.000931"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.123255" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.122864" elapsed="0.000418"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.124030" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.123762" elapsed="0.000339">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.124231" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.123439" elapsed="0.000817"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.124815" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.124417" elapsed="0.000425"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.125151" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:01.125287" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:01.125013" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.125702" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.125461" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.126821" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.126566" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.127306" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.127039" elapsed="0.000293"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.127643" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.127840" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.128021" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.127515" elapsed="0.000565"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.127380" elapsed="0.000729"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:01.128151" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:01.128308" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:01.126111" elapsed="0.002221"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.125813" elapsed="0.002550"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.128529" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.128388" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.125794" elapsed="0.002822"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.129189" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.128752" elapsed="0.000464"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.129263" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.122262" elapsed="0.007121"/>
</kw>
<msg time="2026-04-07T17:21:01.129434" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.110358" elapsed="0.019183"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.141457" elapsed="0.000061"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.153309" elapsed="0.000066"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.164959" elapsed="0.000090"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.165383" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.165760" elapsed="0.000054"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.166277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.166136" elapsed="0.000198"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:01.166120" elapsed="0.000238"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.166492" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.166655" 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-07T17:21:01.166815" elapsed="0.000019"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.166090" elapsed="0.000777"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.165941" elapsed="0.000961"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.167215" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.167369" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.167557" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:01.104887" elapsed="0.062720"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.169933" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.169692" elapsed="0.000325">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.170209" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.169280" elapsed="0.000972"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.170721" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.170391" elapsed="0.000407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.171375" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.171078" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.170855" elapsed="0.000604"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.170350" elapsed="0.001164"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.174278" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.171819" elapsed="0.002504"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:01.174418" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:01.174698" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.168437" elapsed="0.006315"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.177032" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.176767" elapsed="0.000329">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.177323" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.176334" elapsed="0.001033"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:01.177725" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.177504" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.177464" elapsed="0.000419"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.178257" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.178630" elapsed="0.000052"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.178773" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.180631" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.175531" elapsed="0.005149"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.184186" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.183843" elapsed="0.000437"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.184937" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.184614" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.199336" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.200233" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:01.200695" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.187261" elapsed="0.013495"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.185199" elapsed="0.015705"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.201515" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.201075" elapsed="0.000627"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.185158" elapsed="0.016664"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.209781" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.205101" elapsed="0.004894"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.204594" elapsed="0.005437"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.204549" elapsed="0.005507"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.212469" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.210330" elapsed="0.002185"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.210112" elapsed="0.002436"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.210095" elapsed="0.002478"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.213111" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.212725" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.213434" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.213207" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.213980" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.213669" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.213516" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.213189" elapsed="0.000877"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.214576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.214217" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.214896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.214671" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.215446" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.215154" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.214998" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.214653" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.215669" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.216524" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.216239" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.216696" elapsed="0.002098"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.203354" elapsed="0.015589"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.219303" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.219112" elapsed="0.000258"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.219070" elapsed="0.000354"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.225506" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.219720" elapsed="0.005835"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.225651" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:21:01.225941" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.181429" elapsed="0.044578"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.226230" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:01.226485" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.082530" elapsed="0.143981"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.226842" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.226595" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.226577" elapsed="0.000780"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.227391" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:01.078594" elapsed="0.148920"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.074886" elapsed="0.152670"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.074869" elapsed="0.152710"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:01.228269" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.228163" elapsed="0.000164"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.228388" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.228350" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.228145" elapsed="0.000303"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.228586" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:21:01.228707" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:01.227832" elapsed="0.000900"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.229272" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.228891" elapsed="0.000407"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.229901" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.229446" elapsed="0.000481"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.237066" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.236266" elapsed="0.000887"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.237857" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.237325" elapsed="0.000613"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.251266" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.251369" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Follower","LastApplied":121,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":121,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"412.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582461,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:01.251517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.242733" elapsed="0.008835"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.238045" elapsed="0.013688"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.251942" elapsed="0.000126"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.251764" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.238024" elapsed="0.014233"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.256347" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":120,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":120,"Leader":"member-1-shard-topology-config","LastIndex":121,"RaftState":"Follower","LastApplied":121,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":121,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"412.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":121,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":4650},"timestamp":1775582461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.254115" elapsed="0.002397"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.253618" elapsed="0.002963"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.253575" elapsed="0.003078"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.260666" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.257598" elapsed="0.003199"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.256869" elapsed="0.004022"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.256799" elapsed="0.004357"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.263067" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.261911" elapsed="0.001292"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.264124" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.263395" elapsed="0.000903"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.265546" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.264870" elapsed="0.000739"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.264391" elapsed="0.001318"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.263337" elapsed="0.002461"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.267686" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.266558" elapsed="0.001265"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.268836" elapsed="0.000062"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.268121" elapsed="0.000859"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.269861" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.269390" elapsed="0.000516"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.269049" elapsed="0.000939"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.267957" elapsed="0.002098"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.270354" elapsed="0.000642"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.271880" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.271265" elapsed="0.000787"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.272312" elapsed="0.002373"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.252720" elapsed="0.022071"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.275046" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.274887" elapsed="0.000270"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.274868" elapsed="0.000315"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.278414" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.275333" elapsed="0.003109"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.278540" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:01.278696" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.230865" elapsed="0.047858"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.278815" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.278963" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.230148" elapsed="0.048857"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.280193" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.279574" elapsed="0.000648"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:01.280270" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.280440" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:01.279218" elapsed="0.001249"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.280812" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 121, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.280615" elapsed="0.000223"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.281202" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.281001" elapsed="0.000226"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:01.281273" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.281419" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:01.073294" elapsed="0.208149"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:01.281498" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:01.281641" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:01.072382" elapsed="0.209283"/>
</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="PASS" start="2026-04-07T17:21:01.281954" elapsed="0.000205"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.281747" elapsed="0.000450"/>
</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-07T17:21:01.282360" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.282222" 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-07T17:21:01.282570" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.282436" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.281727" elapsed="0.000917"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:01.072220" elapsed="0.210447"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.657891" elapsed="0.624805"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.282735" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:01.282933" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:01.282994" level="INFO">${follower_list} = [2, 3]</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-07T17:21:00.653962" elapsed="0.629056"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.284636" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:01.284720" level="INFO">${leader_count} = 1</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-07T17:21:01.283196" elapsed="0.001548"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.285041" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.284814" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.284796" elapsed="0.000324"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.287010" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:01.285250" elapsed="0.001806"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:01.287444" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.287256" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.287515" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:21:00.651542" elapsed="0.636124"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:21:00.651327" elapsed="0.636385"/>
</iter>
<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-07T17:21:01.291989" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.291596" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.292474" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:01.292171" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:01.292544" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.292697" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.291232" 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-07T17:21:01.292870" elapsed="0.000169"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.293525" 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-07T17:21:01.293195" elapsed="0.000355"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.294002" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:01.293702" elapsed="0.000326"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.294408" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:01.294172" elapsed="0.000261"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.296827" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.296489" elapsed="0.000365"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:01.296899" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.297068" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:01.296157" elapsed="0.000936"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.390265" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.389838" elapsed="0.000461"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.391093" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.390802" elapsed="0.000368">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.391262" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.390470" elapsed="0.000816"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.391829" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.391447" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.392173" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:01.392346" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:01.392029" elapsed="0.000343"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.392767" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.392523" elapsed="0.000352"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.393865" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.393603" elapsed="0.000307"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.394371" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.394102" elapsed="0.000295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.394721" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.394920" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.395106" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.394592" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.394450" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:01.395244" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:21:01.395411" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:01.393264" elapsed="0.002172"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.392953" elapsed="0.002515"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.395635" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.395493" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.392929" elapsed="0.002783"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.396442" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.395850" elapsed="0.000621"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.396520" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.389195" elapsed="0.007449"/>
</kw>
<msg time="2026-04-07T17:21:01.396697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.377306" elapsed="0.019497"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.408500" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.420195" elapsed="0.000059"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.432506" elapsed="0.000061"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.432917" elapsed="0.000584"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.433858" elapsed="0.000055"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.434389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.434246" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:01.434231" elapsed="0.000274"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.434643" 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-07T17:21:01.434808" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.435112" elapsed="0.000026"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.434201" elapsed="0.000974"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.434065" elapsed="0.001150"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.435523" elapsed="0.000056"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.435681" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.435871" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:01.371799" elapsed="0.064122"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.438465" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.438167" elapsed="0.000363">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.438725" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.437711" elapsed="0.001060"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.439261" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.438910" elapsed="0.000432"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.439916" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.439619" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.439400" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.438869" elapsed="0.001323"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.442716" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.440498" elapsed="0.002264"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:01.442860" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:21:01.443169" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.436851" elapsed="0.006369"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.445676" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.445431" elapsed="0.000316">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.445947" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.445011" elapsed="0.001040"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:01.446419" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.446196" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.446154" elapsed="0.000428"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.446885" elapsed="0.000057"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.447285" elapsed="0.000055"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.447443" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.449538" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.444156" elapsed="0.005432"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.453425" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.453093" elapsed="0.000429"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.454211" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.453851" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.464365" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.464960" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:01.465273" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.456422" elapsed="0.008888"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.454443" elapsed="0.010961"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.465767" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.465486" elapsed="0.000403"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.454401" elapsed="0.011563"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.471633" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.468114" elapsed="0.003871"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.467745" elapsed="0.004317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.467710" elapsed="0.004389"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.475513" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.472480" elapsed="0.003096"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.472179" elapsed="0.003445"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.472154" elapsed="0.003504"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.476430" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.475872" elapsed="0.000595"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.476883" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.476565" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.477649" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.477235" elapsed="0.000450"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.477020" elapsed="0.000715"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.476540" elapsed="0.001225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.478495" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.477995" elapsed="0.000537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.479018" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.478629" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.479774" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.479345" elapsed="0.000474"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.479133" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.478604" elapsed="0.001322"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.480152" elapsed="0.000476"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.481267" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.480848" elapsed="0.000455"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.481509" elapsed="0.003106"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.466943" elapsed="0.017875"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.485185" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.484990" elapsed="0.000263"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.484917" elapsed="0.000391"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.491380" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.485601" elapsed="0.005828"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.491525" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:01.491825" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.450490" elapsed="0.041397"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.492129" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:01.492384" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.349236" elapsed="0.143175"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.492745" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.492496" elapsed="0.000709"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.492478" elapsed="0.000757"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.493270" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:01.344801" elapsed="0.148595"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.297162" elapsed="0.196277"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.297145" elapsed="0.196319"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:01.494133" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.494024" elapsed="0.000167"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.494251" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.494214" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.494005" elapsed="0.000306"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.494453" elapsed="0.000021"/>
</kw>
<msg time="2026-04-07T17:21:01.494571" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:01.493720" elapsed="0.000876"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.495142" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.494756" elapsed="0.000413"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.495793" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.495318" elapsed="0.000502"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.501626" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.501097" elapsed="0.000610"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.502482" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.501870" elapsed="0.000690"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.513086" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.513190" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.480","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.480","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"449.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:01.513342" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.507258" elapsed="0.006134"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.502643" elapsed="0.010900"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.513749" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.513572" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.502624" elapsed="0.011574"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.518469" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.480","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.480","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"449.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.516069" elapsed="0.002510"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.515577" elapsed="0.003070"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.515536" elapsed="0.003179"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.522398" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.519377" elapsed="0.003153"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.518859" elapsed="0.003766"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.518818" elapsed="0.003901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.524694" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.523503" elapsed="0.001326"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.525736" elapsed="0.000078"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.525046" elapsed="0.000866"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.527206" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.526514" elapsed="0.000756"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.526029" elapsed="0.001338"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.524965" elapsed="0.002491"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.529387" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.528291" elapsed="0.001233"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.530417" elapsed="0.000079"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.529715" elapsed="0.000876"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.531894" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.531214" elapsed="0.000726"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.530685" elapsed="0.001397"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.529658" elapsed="0.002490"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.532446" elapsed="0.000639"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.533946" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.533351" elapsed="0.000709"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.534321" elapsed="0.002693"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.514679" elapsed="0.022443"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.537363" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.537220" elapsed="0.000251"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.537200" elapsed="0.000296"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.540873" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.537637" elapsed="0.003265"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.541015" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:01.541242" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.496764" elapsed="0.044505"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.541327" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.541475" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.496049" elapsed="0.045452"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.542565" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.542062" elapsed="0.000531"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:01.542642" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.542819" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:01.541715" elapsed="0.001131"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.543249" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.543042" elapsed="0.000234"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.543620" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.543424" elapsed="0.000221"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:01.543691" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.543843" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:01.295551" elapsed="0.248317"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:01.543925" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:01.544172" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:01.294837" elapsed="0.249360"/>
</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-07T17:21:01.544484" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.544276" elapsed="0.000263"/>
</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="PASS" start="2026-04-07T17:21:01.544763" elapsed="0.000188"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.544563" elapsed="0.000440"/>
</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-07T17:21:01.545169" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.545028" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.544258" elapsed="0.000985"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:01.294677" elapsed="0.250589"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.547604" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.547263" elapsed="0.000367"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:01.547674" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.548014" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:01.546911" elapsed="0.001131"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.596505" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.596135" elapsed="0.000397"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.597284" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.597069" elapsed="0.000280">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.597441" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.596689" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.598043" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.597623" elapsed="0.000447"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.598357" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:01.598489" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:01.598223" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.598903" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.598663" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.599871" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.599622" elapsed="0.000293"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.600345" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.600084" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.600675" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.600871" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.601053" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.600549" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.600419" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:01.601182" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.601336" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:01.599311" elapsed="0.002050"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.599031" elapsed="0.002362"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.601558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.601417" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.599011" elapsed="0.002621"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.602223" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.601767" elapsed="0.000484"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.602298" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.595518" elapsed="0.006901"/>
</kw>
<msg time="2026-04-07T17:21:01.602471" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.583828" elapsed="0.018747"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.614420" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.626034" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.637651" elapsed="0.000059"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.638065" elapsed="0.000055"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.638441" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.638936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.638796" elapsed="0.000213"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:01.638782" elapsed="0.000251"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.639169" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.639331" 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-07T17:21:01.639491" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.638752" elapsed="0.000792"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.638620" elapsed="0.000960"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.639874" elapsed="0.000053"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.640045" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.640233" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:01.578436" elapsed="0.061846"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.642649" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.642372" elapsed="0.000346">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.642908" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.641942" elapsed="0.001010"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.643451" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.643125" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.644104" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.643791" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.643587" elapsed="0.000600"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.643083" elapsed="0.001158"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.646728" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.644539" elapsed="0.002233"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:01.646869" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:01.647215" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.641108" elapsed="0.006157"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.649565" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.649314" elapsed="0.000312">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.649821" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.648878" elapsed="0.000987"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:01.650247" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.650025" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.649980" elapsed="0.000426"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.650705" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.651232" elapsed="0.000056"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.651381" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.653388" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.648051" elapsed="0.005388"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.657244" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.656887" elapsed="0.000453"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.658043" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.657663" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.674663" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.675519" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:01.675993" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.660385" elapsed="0.015669"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.658288" elapsed="0.017918"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.676799" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.676336" elapsed="0.000698"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.658246" elapsed="0.018914"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.686017" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.680414" elapsed="0.005808"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.679905" elapsed="0.006354"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.679860" elapsed="0.006423"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.688660" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.686557" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.686339" elapsed="0.002402"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.686322" elapsed="0.002445"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.689308" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.688922" elapsed="0.000413"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.689633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.689405" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.690186" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.689866" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.689714" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.689387" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.690775" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.690421" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.691110" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.690870" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.691632" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.691343" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.691192" elapsed="0.000500"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.690852" elapsed="0.000862"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.691859" elapsed="0.000355"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.692652" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.692381" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.692824" elapsed="0.002104"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.678682" elapsed="0.016406"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.695413" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.695226" elapsed="0.000253"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.695185" elapsed="0.000349"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.701557" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.695831" elapsed="0.005774"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.701700" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:01.702001" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.654384" elapsed="0.047669"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.702271" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:01.702522" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.555959" elapsed="0.146590"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.702877" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.702632" elapsed="0.000691"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.702614" elapsed="0.000737"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.703385" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:01.552035" elapsed="0.151474"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.548112" elapsed="0.155439"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.548094" elapsed="0.155480"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:01.704219" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.704104" elapsed="0.000173"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.704337" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.704300" elapsed="0.000076"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.704087" elapsed="0.000311"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.704537" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:21:01.704655" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:01.703825" elapsed="0.000855"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.705223" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.704840" elapsed="0.000410"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.705853" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.705400" elapsed="0.000480"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.711723" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.711196" elapsed="0.000608"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.712520" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.711984" elapsed="0.000616"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.723791" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.723907" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"272.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:01.724079" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.717315" elapsed="0.006814"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.712682" elapsed="0.011598"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.724486" elapsed="0.000046"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.724309" elapsed="0.000383"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.712664" elapsed="0.012053"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.729260" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"272.4 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.726668" elapsed="0.002787"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.726197" elapsed="0.003354"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.726154" elapsed="0.003491"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.733613" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.730542" elapsed="0.003202"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.729849" elapsed="0.003988"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.729792" elapsed="0.004138"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.735902" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.734785" elapsed="0.001281"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.736948" elapsed="0.000100"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.736259" elapsed="0.000887"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.738489" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.737720" elapsed="0.000832"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.737239" elapsed="0.001408"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.736202" elapsed="0.002538"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.740634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.739504" elapsed="0.001296"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.741470" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.740979" elapsed="0.000616"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.742502" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.742034" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.741662" elapsed="0.000953"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.740924" elapsed="0.001792"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.743034" elapsed="0.000637"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.744552" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.743936" elapsed="0.000715"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.744907" elapsed="0.002499"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.725177" elapsed="0.022350"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.747826" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.747622" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.747603" elapsed="0.000362"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.751250" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.748120" elapsed="0.003159"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.751398" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:01.751556" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.706818" elapsed="0.044764"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.751637" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:01.751784" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.706107" elapsed="0.045703"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.752842" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.752367" elapsed="0.000503"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:01.752952" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:01.753147" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:01.752036" elapsed="0.001137"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.753519" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.753321" elapsed="0.000225"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.753891" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.753694" elapsed="0.000223"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:01.753963" elapsed="0.000116"/>
</return>
<msg time="2026-04-07T17:21:01.754206" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:01.546306" elapsed="0.207924"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:01.754287" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:01.754431" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:01.545584" elapsed="0.208871"/>
</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="PASS" start="2026-04-07T17:21:01.754741" elapsed="0.000190"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.754531" elapsed="0.000455"/>
</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-07T17:21:01.755156" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.755013" 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-07T17:21:01.755381" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.755235" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.754514" elapsed="0.000941"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:01.545422" elapsed="0.210057"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.757807" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.757448" elapsed="0.000386"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:01.757879" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.758103" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:01.757108" elapsed="0.001021"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.806640" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.806247" elapsed="0.000421"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.807376" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.807168" elapsed="0.000270">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.807528" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.806824" elapsed="0.000728"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.808101" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.807708" elapsed="0.000419"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.808415" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:01.808539" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:01.808282" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.809008" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.808751" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.809980" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.809714" elapsed="0.000313"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.810450" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.810180" elapsed="0.000296"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.810779" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.811019" elapsed="0.000026"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.811189" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.810653" elapsed="0.000593"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.810523" elapsed="0.000751"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:01.811316" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.811471" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:01.809401" elapsed="0.002094"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.809119" elapsed="0.002407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.811690" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.811551" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.809101" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.812340" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.811901" elapsed="0.000466"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.812414" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.805628" elapsed="0.006906"/>
</kw>
<msg time="2026-04-07T17:21:01.812586" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.794034" elapsed="0.018657"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.824545" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.836083" elapsed="0.000060"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.847658" elapsed="0.000060"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.848098" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.848474" elapsed="0.000053"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.849058" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.848902" elapsed="0.000214"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:01.848887" elapsed="0.000252"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.849276" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.849439" 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-07T17:21:01.849600" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:01.848858" elapsed="0.000795"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.848725" elapsed="0.000965"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.850017" elapsed="0.000054"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.850172" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.850360" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:01.788633" elapsed="0.061776"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.852695" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.852455" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.852947" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.852042" elapsed="0.000979"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.853488" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.853162" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.854179" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.853855" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.853624" elapsed="0.000638"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.853121" elapsed="0.001195"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.856789" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.854614" elapsed="0.002220"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:01.856928" elapsed="0.000123"/>
</return>
<msg time="2026-04-07T17:21:01.857272" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.851238" elapsed="0.006083"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:01.859569" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:01.859333" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:01.859901" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:01.858909" elapsed="0.001038"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:01.860432" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.860214" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.860173" elapsed="0.000414"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.860879" elapsed="0.000055"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.861268" elapsed="0.000053"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.861409" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.864440" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:01.858118" elapsed="0.006373"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.868260" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.867910" elapsed="0.000446"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.869023" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.868679" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.886137" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.887030" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:01.887480" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.871300" elapsed="0.016239"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.869255" elapsed="0.018434"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.888302" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.887819" elapsed="0.000677"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.869213" elapsed="0.019400"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.896131" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.891870" elapsed="0.004540"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.891391" elapsed="0.005070"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.891347" elapsed="0.005148"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.899867" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.896876" elapsed="0.003053"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.896572" elapsed="0.003425"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.896548" elapsed="0.003484"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.900767" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.900248" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.901283" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.900915" elapsed="0.000450"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.902050" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.901613" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.901399" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.900888" elapsed="0.001279"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.902886" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.902382" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.903361" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.903042" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.904124" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.903688" elapsed="0.000472"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.903474" elapsed="0.000735"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.903015" elapsed="0.001224"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.904439" elapsed="0.000508"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.905581" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.905200" elapsed="0.000416"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.905858" elapsed="0.002120"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.890165" elapsed="0.017963"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.908455" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.908266" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.908225" elapsed="0.000351"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.914478" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.908881" elapsed="0.005646"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.914623" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:01.914908" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.865413" elapsed="0.049545"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.915195" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:01.915446" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.766179" elapsed="0.149294"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.915805" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.915556" elapsed="0.000699"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.915539" elapsed="0.000745"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.916318" elapsed="0.000027"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:01.762262" elapsed="0.154181"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.758344" elapsed="0.158140"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.758179" elapsed="0.158328"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:01.917189" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:01.917083" elapsed="0.000164"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.917307" elapsed="0.000012"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.917270" elapsed="0.000075"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.917065" elapsed="0.000302"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.917506" elapsed="0.000022"/>
</kw>
<msg time="2026-04-07T17:21:01.917623" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:01.916792" elapsed="0.000856"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.918189" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.917808" elapsed="0.000408"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.918820" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.918366" elapsed="0.000481"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.924908" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.924360" elapsed="0.000667"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.925772" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.925239" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:01.936933" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:01.937238" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:01 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:01 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"299.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:01.937399" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:01.930498" elapsed="0.006951"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.925936" elapsed="0.011663"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.937807" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.937627" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.925917" elapsed="0.012137"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.942767" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"299.2 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582461,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.939868" elapsed="0.003095"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.939397" elapsed="0.003685"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.939356" elapsed="0.003820"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.947131" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:01.944058" elapsed="0.003205"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.943374" elapsed="0.003983"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.943318" elapsed="0.004133"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.949492" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.948228" elapsed="0.001401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.950525" elapsed="0.000077"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.949820" elapsed="0.000881"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.951961" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.951305" elapsed="0.000768"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.950795" elapsed="0.001377"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.949763" elapsed="0.002498"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.953903" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.953068" elapsed="0.000947"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.954645" elapsed="0.000055"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.954155" elapsed="0.000614"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.955665" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:01.955198" elapsed="0.000512"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.954836" elapsed="0.000942"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.954114" elapsed="0.001730"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:01.956177" elapsed="0.000625"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:01.957743" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.957152" elapsed="0.000687"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.958113" elapsed="0.002390"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:01.938501" elapsed="0.022111"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.960853" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.960708" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.960689" elapsed="0.000420"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:01.964277" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:01.961253" elapsed="0.003054"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:01.964406" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:01.964565" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:01.919960" elapsed="0.044631"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:01.964647" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:01.964792" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755824...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:01.919067" elapsed="0.045751"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.965999" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:01.965507" elapsed="0.000523"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:01.966119" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:01.966296" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582461, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:01.965174" elapsed="0.001149"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.966668" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.966471" elapsed="0.000226"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.967064" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.966849" elapsed="0.000241"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:01.967136" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:01.967281" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:01.756505" elapsed="0.210800"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:01.967361" elapsed="0.000024"/>
</return>
<msg time="2026-04-07T17:21:01.967501" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:01.755791" elapsed="0.211734"/>
</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="PASS" start="2026-04-07T17:21:01.967820" elapsed="0.000387"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:01.967602" elapsed="0.000645"/>
</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-07T17:21:01.968415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.968271" 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-07T17:21:01.968630" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.968493" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.967585" elapsed="0.001118"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:01.755632" elapsed="0.213094"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.294480" elapsed="0.674276"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.968797" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:01.969038" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:01.969087" level="INFO">${follower_list} = [2, 3]</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-07T17:21:01.290494" elapsed="0.678616"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.969548" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:01.969623" level="INFO">${leader_count} = 1</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-07T17:21:01.969280" elapsed="0.000367"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:01.969925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:01.969716" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.969698" elapsed="0.000347"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.972104" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:01.970180" elapsed="0.001970"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:01.972491" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.972307" elapsed="0.000210"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.972562" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:21:01.288061" elapsed="0.684652"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:21:01.287793" elapsed="0.684965"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:21:00.651201" elapsed="1.321588"/>
</for>
<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="PASS" start="2026-04-07T17:21:00.650803" elapsed="1.322038"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:20:59.370444" elapsed="2.602494"/>
</kw>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:20:59.052160" elapsed="2.920966"/>
</test>
<test id="s1-s2-s2-t2" name="Start OVS Multiple Connections" line="21">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:01.977040" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:01.976763" 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-07T17:21:01.978266" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.978158" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.978140" 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-07T17:21:01.982824" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.982720" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.982700" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.984003" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:01.983605" elapsed="0.000426"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:01.984486" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:01.984185" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:01.984557" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:01.984708" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:01.983221" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.990066" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.989937" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.989918" elapsed="0.000216"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:01.991328" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:01.991223" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:01.991205" elapsed="0.000200"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:01.991899" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:01.991545" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:01.992353" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:01.992096" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.023659" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:01.992911" elapsed="0.030910"/>
</kw>
<msg time="2026-04-07T17:21:02.024006" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:02.024054" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:01.992534" elapsed="0.031556"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.079824" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:02.024645" elapsed="0.055390"/>
</kw>
<msg time="2026-04-07T17:21:02.080209" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:02.080254" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.024255" elapsed="0.056034"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.080588" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.080367" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.080347" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.081227" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:02.080827" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.081628" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.081416" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.081398" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:02.081761" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:02.084110" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:02.085563" elapsed="0.000528"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:02.087010" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:02.082637" elapsed="0.004766"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:02.082057" elapsed="0.005459"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:01.990900" elapsed="0.096715"/>
</kw>
<msg time="2026-04-07T17:21:02.087706" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.087750" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:01.990281" elapsed="0.097505"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:02.087982" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:02.087863" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.087844" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.088502" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.088830" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.088901" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:01.989596" elapsed="0.099440"/>
</kw>
<msg time="2026-04-07T17:21:02.089131" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.089176" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:01.985102" elapsed="0.104109"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.089527" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.089285" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.089268" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:01.984948" elapsed="0.104679"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.095094" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:02.094984" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.094952" elapsed="0.000210"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.096348" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:02.096243" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.096226" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:02.096902" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:02.096552" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.097353" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:02.097097" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.135111" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:02.097923" elapsed="0.037358"/>
</kw>
<msg time="2026-04-07T17:21:02.135500" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:02.135547" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.097530" elapsed="0.038053"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.185304" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:02.136160" elapsed="0.049329"/>
</kw>
<msg time="2026-04-07T17:21:02.185657" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:02.185703" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.135750" elapsed="0.049988"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.186058" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.185815" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.185795" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.186663" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:02.186298" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.187038" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.186807" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.186790" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:02.187172" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:02.189470" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:21:02.190886" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:02.192279" elapsed="0.000313"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:02.188027" elapsed="0.004635"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:02.187422" elapsed="0.005351"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:02.095917" elapsed="0.096955"/>
</kw>
<msg time="2026-04-07T17:21:02.192961" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.193022" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.095308" elapsed="0.097751"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:02.193239" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:02.193134" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.193116" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.193700" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.194042" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.194115" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:02.094630" elapsed="0.099592"/>
</kw>
<msg time="2026-04-07T17:21:02.194314" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.194357" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.089918" elapsed="0.104473"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.194746" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.194502" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.194483" elapsed="0.000341"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:02.089782" elapsed="0.105065"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.200069" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:02.199932" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.199914" elapsed="0.000223"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.201315" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:02.201210" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.201192" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:02.201869" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:02.201519" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.202313" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:02.202062" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.231933" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:02.202871" elapsed="0.029246"/>
</kw>
<msg time="2026-04-07T17:21:02.232282" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:02.232327" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.202491" elapsed="0.029870"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.275545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:02.232904" elapsed="0.042825"/>
</kw>
<msg time="2026-04-07T17:21:02.275901" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:02.275946" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.232525" elapsed="0.043478"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.276296" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.276081" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.276061" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.276903" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "V "S "[C "M "u "l "t "i "p "l "e "[C "[78CC "[A[78Co
 "n "n "e "c "t "i "o "n "s "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:02.276537" elapsed="0.000462"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.277278" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.277067" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.277049" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:02.277410" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:02.279712" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:21:02.281168" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:02.282550" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:02.278236" elapsed="0.004728"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:02.277655" elapsed="0.005435"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:02.200893" elapsed="0.082297"/>
</kw>
<msg time="2026-04-07T17:21:02.283327" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.283371" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.200282" elapsed="0.083124"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:02.283589" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:02.283483" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.283464" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.284066" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.284393" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:02.284464" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:02.199582" elapsed="0.084988"/>
</kw>
<msg time="2026-04-07T17:21:02.284661" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:02.284704" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:02.195117" elapsed="0.089621"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:02.285087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.284816" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.284799" elapsed="0.000367"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:02.194981" elapsed="0.090207"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:01.984784" elapsed="0.300433"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:01.982363" elapsed="0.302909"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:01.977859" elapsed="0.307467"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:01.977446" elapsed="0.307925"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:01.974380" elapsed="0.311044"/>
</kw>
<kw name="Add Multiple Managers to OVS" owner="OVSDB">
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.292741" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:02.292360" elapsed="0.000408"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.293309" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:02.292922" elapsed="0.000413"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:02.293380" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:02.293534" level="INFO">${index_list} = [1, 2, 3]</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-07T17:21:02.291985" elapsed="0.001574"/>
</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-07T17:21:02.295951" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:02.295694" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:02.295676" elapsed="0.000371"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.296329" 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-07T17:21:02.296430" 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-07T17:21:02.296192" elapsed="0.000264"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.296991" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:21:02.296602" elapsed="0.000436"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.297594" level="INFO">${conn_id} = 617</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-07T17:21:02.297229" elapsed="0.000390"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:02.298521" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:02.298597" 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-07T17:21:02.298234" elapsed="0.000387"/>
</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-07T17:21:02.298775" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.299937" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:02.948852" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:20:55 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:02.299624" elapsed="0.649368"/>
</kw>
<msg time="2026-04-07T17:21:02.949064" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:02.299274" elapsed="0.649856"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:02.297829" elapsed="0.651394"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:02.949609" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:21:04.097030" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:04.097409" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:04.097511" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:02.949413" elapsed="1.148154"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.098089" elapsed="0.000678"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.099888" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.099224" elapsed="0.000819"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.100536" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:04.100231" elapsed="0.000414"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.100175" elapsed="0.000527"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:04.101123" elapsed="0.000067"/>
</return>
<status status="PASS" start="2026-04-07T17:21:04.100839" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.100800" elapsed="0.000516"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.101391" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.106696" elapsed="0.000368"/>
</kw>
<kw name="Open 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-07T17:21:04.107242" elapsed="0.000167"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.107553" elapsed="0.000099"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:04.102240" elapsed="0.005468"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:02.295173" elapsed="1.812634"/>
</kw>
<msg time="2026-04-07T17:21:04.107936" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:02.294609" elapsed="1.813400"/>
</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="PASS" start="2026-04-07T17:21:02.294119" elapsed="1.813977"/>
</kw>
<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-07T17:21:04.110208" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:04.109917" elapsed="0.000348"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.109898" elapsed="0.000391"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.110576" 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-07T17:21:04.110679" 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-07T17:21:04.110436" elapsed="0.000270"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.111258" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:21:04.110859" elapsed="0.000445"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.111823" level="INFO">${conn_id} = 619</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-07T17:21:04.111456" elapsed="0.000392"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.112747" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:04.112823" 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-07T17:21:04.112462" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.113014" elapsed="0.000317"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.114209" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:04.486472" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:02 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:04.113876" elapsed="0.372738"/>
</kw>
<msg time="2026-04-07T17:21:04.486697" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.113516" elapsed="0.373259"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:04.112075" elapsed="0.374810"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.487408" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:21:04.529952" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:21:04.530248" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:04.530345" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:04.487148" elapsed="0.043247"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.530766" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.532413" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.531689" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.533038" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:04.532712" elapsed="0.000438"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.532657" elapsed="0.000545"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:04.533610" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:21:04.533317" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.533284" elapsed="0.000521"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.533881" elapsed="0.000030"/>
</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-07T17:21:04.540460" elapsed="0.000484"/>
</kw>
<kw name="Open 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-07T17:21:04.541121" elapsed="0.000187"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.541459" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:04.534935" elapsed="0.006675"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:04.109368" elapsed="0.432335"/>
</kw>
<msg time="2026-04-07T17:21:04.541759" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.108780" elapsed="0.433030"/>
</kw>
<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="PASS" start="2026-04-07T17:21:04.108275" elapsed="0.433619"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:21:02.293757" elapsed="2.248202"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.542416" level="INFO">${ovs_opt} = </msg>
<var>${ovs_opt}</var>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:04.542154" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.543228" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:04.542797" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.543646" level="INFO">  tcp:10.30.170.175:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.543409" elapsed="0.000281"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:04.542658" elapsed="0.001064"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.544352" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:04.543937" elapsed="0.000441"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.544783" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.544546" elapsed="0.000279"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:04.543812" elapsed="0.001045"/>
</iter>
<iter>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.545490" level="INFO">${ovs_opt} =   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<var>${ovs_opt}</var>
<arg>${ovs_opt}</arg>
<arg>${SPACE}tcp:${ODL_SYSTEM_${index}_IP}:${ovs_mgr_port}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:04.545085" elapsed="0.000431"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.545902" level="INFO">  tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640</msg>
<arg>${ovs_opt}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.545667" elapsed="0.000279"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:04.544944" elapsed="0.001047"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:04.542500" elapsed="0.003521"/>
</for>
<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-07T17:21:04.548118" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:04.547834" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.547815" elapsed="0.000382"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.548494" 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-07T17:21:04.548595" 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-07T17:21:04.548342" elapsed="0.000279"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.549156" level="INFO">Attempting to execute command "sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640" on remote system "10.30.171.56" 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-07T17:21:04.548768" elapsed="0.000434"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.549715" level="INFO">${conn_id} = 621</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-07T17:21:04.549352" elapsed="0.000393"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.550879" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:04.550954" 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-07T17:21:04.550598" elapsed="0.000394"/>
</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-07T17:21:04.551148" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.552299" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:04.889393" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:04 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:04.551984" elapsed="0.337514"/>
</kw>
<msg time="2026-04-07T17:21:04.889564" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.551625" elapsed="0.338005"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:04.550203" elapsed="0.339524"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.890169" level="INFO">Executing command 'sudo ovs-vsctl set-manager   tcp:10.30.170.175:6640  tcp:10.30.171.205:6640  tcp:10.30.170.206:6640'.</msg>
<msg time="2026-04-07T17:21:04.953234" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:04.953501" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:04.953601" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:04.889935" elapsed="0.063716"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.954056" elapsed="0.000713"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.955889" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:04.955210" elapsed="0.000824"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.956506" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:04.956205" elapsed="0.000408"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.956158" elapsed="0.000506"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:04.957085" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:21:04.956789" elapsed="0.000426"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.956751" elapsed="0.000516"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:04.957342" elapsed="0.000039"/>
</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-07T17:21:04.963133" elapsed="0.000745"/>
</kw>
<kw name="Open 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-07T17:21:04.964263" elapsed="0.000335"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:04.964833" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:04.958060" elapsed="0.006934"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:04.547314" elapsed="0.417771"/>
</kw>
<msg time="2026-04-07T17:21:04.965139" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.546733" elapsed="0.418455"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl set-manager ${ovs_opt}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:04.546214" elapsed="0.419053"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:21:04.976294" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:04.976026" elapsed="0.000384"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:04.976006" elapsed="0.000431"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.976725" 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-07T17:21:04.976829" 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-07T17:21:04.976583" elapsed="0.000272"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.977397" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:21:04.977018" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.978006" level="INFO">${conn_id} = 623</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-07T17:21:04.977593" elapsed="0.000439"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:04.978958" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:04.979055" 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-07T17:21:04.978627" elapsed="0.000453"/>
</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-07T17:21:04.979249" elapsed="0.000362"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:04.980953" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:05.362105" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:04 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:04.980154" elapsed="0.382060"/>
</kw>
<msg time="2026-04-07T17:21:05.362277" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.979778" elapsed="0.382556"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:04.978243" elapsed="0.384175"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:05.362781" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:21:05.385472" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:05.385714" level="INFO">${stdout} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<msg time="2026-04-07T17:21:05.385813" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:05.362595" elapsed="0.023268"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:05.386259" elapsed="0.000830"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:05.388125" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:05.387486" elapsed="0.000731"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:05.388628" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:05.388373" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:05.388328" elapsed="0.000452"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:05.389163" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:21:05.388897" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:05.388864" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:05.389419" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:05.395081" elapsed="0.000748"/>
</kw>
<kw name="Open 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-07T17:21:05.396105" elapsed="0.000151"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:05.396398" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:05.390109" elapsed="0.006435"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:04.975460" elapsed="0.421173"/>
</kw>
<msg time="2026-04-07T17:21:05.396731" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:04.974896" elapsed="0.421885"/>
</kw>
<msg time="2026-04-07T17:21:05.396893" level="INFO">${output} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:04.974375" elapsed="0.422543"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:05.397332" level="INFO">e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:05.397086" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<msg time="2026-04-07T17:21:05.398061" level="FAIL">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</msg>
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="FAIL" start="2026-04-07T17:21:05.397660" elapsed="0.000482">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:05.397442" elapsed="0.000780">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:05.397424" elapsed="0.000831">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:05.398468" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:05.398323" elapsed="0.000200"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:05.398306" elapsed="0.000242"/>
</if>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:21:05.398579" elapsed="0.000014"/>
</return>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="FAIL" start="2026-04-07T17:21:04.973922" elapsed="0.424766">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<return>
<value>${output}</value>
<status status="NOT RUN" start="2026-04-07T17:21:05.398749" elapsed="0.000015"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="FAIL" start="2026-04-07T17:21:04.965932" elapsed="0.432913">'e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
    Manager "tcp:10.30.170.206:6640"
    Manager "tcp:10.30.170.175:6640"
    ovs_version: "2.17.11"' does not contain 'is_connected'</status>
</kw>
<kw name="Verify OVS Reports Connected" owner="OVSDB">
<kw name="Verify Ovs-vsctl Output" owner="OVSDB">
<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-07T17:21:06.416368" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.416026" elapsed="0.000425"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.415994" elapsed="0.000488"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.416845" 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-07T17:21:06.416985" 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-07T17:21:06.416637" elapsed="0.000376"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.417567" level="INFO">Attempting to execute command "sudo ovs-vsctl show" on remote system "10.30.171.56" 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-07T17:21:06.417166" elapsed="0.000449"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.418168" level="INFO">${conn_id} = 625</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-07T17:21:06.417768" elapsed="0.000425"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.421497" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:06.421576" 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-07T17:21:06.421177" elapsed="0.000423"/>
</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-07T17:21:06.421761" elapsed="0.000350"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.423467" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:06.785134" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:05 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:06.422639" elapsed="0.362655"/>
</kw>
<msg time="2026-04-07T17:21:06.785374" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:06.422280" elapsed="0.363179"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:06.418406" elapsed="0.367166"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.786130" level="INFO">Executing command 'sudo ovs-vsctl show'.</msg>
<msg time="2026-04-07T17:21:06.808759" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:06.809039" level="INFO">${stdout} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<msg time="2026-04-07T17:21:06.809144" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:06.785818" elapsed="0.023376"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:06.809546" elapsed="0.000515"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.811116" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.810473" elapsed="0.000734"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.811676" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:06.811384" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.811330" elapsed="0.000504"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:06.812214" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:21:06.811950" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.811917" elapsed="0.000478"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.812468" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:06.818580" elapsed="0.000606"/>
</kw>
<kw name="Open 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-07T17:21:06.819348" elapsed="0.000163"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:06.819655" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:06.813183" elapsed="0.006620"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:06.415450" elapsed="0.404444"/>
</kw>
<msg time="2026-04-07T17:21:06.819951" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:06.414765" elapsed="0.405253"/>
</kw>
<msg time="2026-04-07T17:21:06.820138" level="INFO">${output} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>${ovs_system}</arg>
<arg>sudo ovs-vsctl ${vsctl_args}</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:06.414220" elapsed="0.405945"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.820568" level="INFO">e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.820322" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;True&quot;">
<kw name="Should Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` does not contain ``item`` one or more times.</doc>
<status status="PASS" start="2026-04-07T17:21:06.820895" elapsed="0.000369"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:06.820680" elapsed="0.000623"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.820661" elapsed="0.001049"/>
</if>
<if>
<branch type="IF" condition="&quot;${should_match}&quot; == &quot;False&quot;">
<kw name="Should Not Contain" owner="BuiltIn">
<arg>${output}</arg>
<arg>${expected_output}</arg>
<doc>Fails if ``container`` contains ``item`` one or more times.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.822011" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.821772" elapsed="0.000356"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.821755" elapsed="0.000399"/>
</if>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:21:06.822186" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:06.822340" level="INFO">${output} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>show</arg>
<arg>is_connected</arg>
<arg>${tools_system}</arg>
<doc>A wrapper keyword to make it easier to validate ovs-vsctl output, and gives an easy
way to check this output in a WUKS. The argument ${should_match} can control if the match should
exist (True} or not (False) or don't care (anything but True or False). ${should_match} is True by default</doc>
<status status="PASS" start="2026-04-07T17:21:06.413726" elapsed="0.408640"/>
</kw>
<return>
<value>${output}</value>
<status status="PASS" start="2026-04-07T17:21:06.822418" elapsed="0.000025"/>
</return>
<arg>${tools_system}</arg>
<doc>Uses "vsctl show" to check for string "is_connected"</doc>
<status status="PASS" start="2026-04-07T17:21:06.399742" elapsed="0.422794"/>
</kw>
<msg time="2026-04-07T17:21:06.822618" level="INFO">${output} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640...</msg>
<var>${output}</var>
<arg>5s</arg>
<arg>1s</arg>
<arg>Verify OVS Reports Connected</arg>
<arg>${tools_system}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:21:04.965430" elapsed="1.857214"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.823068" level="INFO">e28f74da-cb36-4e4b-95a3-49cc2a0e6630
    Manager "tcp:10.30.171.205:6640"
        is_connected: true
    Manager "tcp:10.30.170.206:6640"
        is_connected: true
    Manager "tcp:10.30.170.175:6640"
        is_connected: true
    ovs_version: "2.17.11"</msg>
<arg>${output}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.822802" elapsed="0.000312"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:06.823458" level="INFO">${controller_index} = 1</msg>
<var>${controller_index}</var>
<arg>${index_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.823263" elapsed="0.000221"/>
</kw>
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.824362" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:06.824067" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:06.824432" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:06.824575" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${controller_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:06.823703" elapsed="0.000897"/>
</kw>
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Get OVSDB UUID" owner="OVSDB">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.833486" level="INFO">${uuid} = </msg>
<var>${uuid}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:06.831598" elapsed="0.001914"/>
</kw>
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:06.840368" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:06.841569" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1376'} 
 body={"network-topology:topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]} 
 </msg>
<msg time="2026-04-07T17:21:06.841744" level="INFO">${resp} = &lt;Response [200]&gt;</msg>
<var>${resp}</var>
<arg>${controller_http_session}</arg>
<arg>url=${RFC8040_OPERATIONAL_TOPO_OVSDB1_API}</arg>
<arg>expected_status=200</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:06.833682" elapsed="0.008098"/>
</kw>
<kw name="Log Content" owner="Utils">
<if>
<branch type="IF" condition="'''${resp_content}''' != '${EMPTY}'">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.848835" level="INFO">${resp_json} = {
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630",
                    "ovsdb:co...</msg>
<var>${resp_json}</var>
<arg>json.dumps(json.loads('''${resp_content}'''), sort_keys=True, indent=4, separators=(',', ': '))</arg>
<arg>modules=json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:06.847851" elapsed="0.001024"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:06.845259" elapsed="0.003672"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${resp_json}</var>
<arg>${EMPTY}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.849194" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.848987" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.845231" elapsed="0.004071"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.849897" level="INFO">{
    "network-topology:topology": [
        {
            "node": [
                {
                    "node-id": "ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630",
                    "ovsdb:connection-info": {
                        "local-ip": "10.30.170.175",
                        "local-port": 6640,
                        "remote-ip": "10.30.171.56",
                        "remote-port": 53074
                    },
                    "ovsdb:datapath-type-entry": [
                        {
                            "datapath-type": "ovsdb:datapath-type-netdev"
                        },
                        {
                            "datapath-type": "ovsdb:datapath-type-system"
                        }
                    ],
                    "ovsdb:db-version": "8.3.0",
                    "ovsdb:interface-type-entry": [
                        {
                            "interface-type": "ovsdb:interface-type-vxlan"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-tap"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-stt"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-internal"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-patch"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-lisp"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-geneve"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-gre"
                        },
                        {
                            "interface-type": "ovsdb:interface-type-system"
                        }
                    ],
                    "ovsdb:manager-entry": [
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.171.205:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.175:6640"
                        },
                        {
                            "connected": true,
                            "number_of_connections": 1,
                            "target": "tcp:10.30.170.206:6640"
                        }
                    ],
                    "ovsdb:openvswitch-external-ids": [
                        {
                            "external-id-key": "system-id",
                            "external-id-value": ""
                        },
                        {
                            "external-id-key": "hostname",
                            "external-id-value": "localhost"
                        },
                        {
                            "external-id-key": "rundir",
                            "external-id-value": "/var/run/openvswitch"
                        }
                    ],
                    "ovsdb:ovs-version": "2.17.11"
                }
            ],
            "topology-id": "ovsdb:1"
        }
    ]
}</msg>
<arg>${resp_json}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.849528" elapsed="0.000555"/>
</kw>
<return>
<value>${resp_json}</value>
<status status="PASS" start="2026-04-07T17:21:06.850128" elapsed="0.000030"/>
</return>
<arg>${resp.text}</arg>
<status status="PASS" start="2026-04-07T17:21:06.842188" elapsed="0.008068"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.853187" level="INFO">${json_data} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:06.852736" elapsed="0.000480"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:06.853264" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:06.853456" level="INFO">${resp_json} = {'network-topology:topology': [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interf...</msg>
<var>${resp_json}</var>
<arg>${resp.text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:06.850462" elapsed="0.003020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:06.853843" level="INFO">${topologies} = [{'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-ty...</msg>
<var>${topologies}</var>
<arg>${resp_json}</arg>
<arg>network-topology:topology</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.853634" elapsed="0.000235"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:06.854241" level="INFO">${topology} = {'topology-id': 'ovsdb:1', 'node': [{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-typ...</msg>
<var>${topology}</var>
<arg>${topologies}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.854036" elapsed="0.000232"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:06.854617" level="INFO">${node_list} = [{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsd...</msg>
<var>${node_list}</var>
<arg>${topology}</arg>
<arg>node</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.854418" elapsed="0.000225"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.855090" level="INFO">[{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb:interface-type-tap'}, {'interface-type': 'ovsdb:interface-type-stt'}, {'interface-type': 'ovsdb:interface-type-internal'}, {'interface-type': 'ovsdb:interface-type-patch'}, {'interface-type': 'ovsdb:interface-type-lisp'}, {'interface-type': 'ovsdb:interface-type-geneve'}, {'interface-type': 'ovsdb:interface-type-gre'}, {'interface-type': 'ovsdb:interface-type-system'}], 'ovsdb:ovs-version': '2.17.11', 'ovsdb:connection-info': {'local-port': 6640, 'remote-port': 53074, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}, 'ovsdb:openvswitch-external-ids': [{'external-id-key': 'system-id', 'external-id-value': ''}, {'external-id-key': 'hostname', 'external-id-value': 'localhost'}, {'external-id-key': 'rundir', 'external-id-value': '/var/run/openvswitch'}], 'ovsdb:datapath-type-entry': [{'datapath-type': 'ovsdb:datapath-type-netdev'}, {'datapath-type': 'ovsdb:datapath-type-system'}], 'ovsdb:manager-entry': [{'target': 'tcp:10.30.171.205:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.175:6640', 'number_of_connections': 1, 'connected': True}, {'target': 'tcp:10.30.170.206:6640', 'number_of_connections': 1, 'connected': True}]}]</msg>
<arg>${node_list}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.854794" elapsed="0.000530"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:06.855899" level="INFO">${node_id} = ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${node_id}</var>
<arg>${node}</arg>
<arg>node-id</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.855724" elapsed="0.000201"/>
</kw>
<kw name="Replace String" owner="String">
<msg time="2026-04-07T17:21:06.858052" level="INFO">${node_uuid} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${node_uuid}</var>
<arg>${node_id}</arg>
<arg>ovsdb://uuid/</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.856099" elapsed="0.001980"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.858584" elapsed="0.000146"/>
</kw>
<msg time="2026-04-07T17:21:06.858826" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:06.858874" level="INFO">${connection_info} = {'local-port': 6640, 'remote-port': 53074, 'local-ip': '10.30.170.175', 'remote-ip': '10.30.171.56'}</msg>
<var>${status}</var>
<var>${connection_info}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${node}</arg>
<arg>ovsdb:connection-info</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.858245" elapsed="0.000652"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get From Dictionary" owner="Collections">
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.859406" elapsed="0.000147"/>
</kw>
<msg time="2026-04-07T17:21:06.859647" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:06.859689" level="INFO">${remote_ip} = 10.30.171.56</msg>
<var>${status}</var>
<var>${remote_ip}</var>
<arg>Collections.Get From Dictionary</arg>
<arg>${connection_info}</arg>
<arg>remote-ip</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.859076" elapsed="0.000635"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.860310" level="INFO">${uuid} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${uuid}</var>
<arg>'${remote_ip}' == '${ovs_system_ip}'</arg>
<arg>${node_uuid}</arg>
<arg>${uuid}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:06.859899" elapsed="0.000437"/>
</kw>
<var name="${node}">{'node-id': 'ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630', 'ovsdb:db-version': '8.3.0', 'ovsdb:interface-type-entry': [{'interface-type': 'ovsdb:interface-type-vxlan'}, {'interface-type': 'ovsdb...</var>
<status status="PASS" start="2026-04-07T17:21:06.855590" elapsed="0.004785"/>
</iter>
<var>${node}</var>
<value>@{node_list}</value>
<status status="PASS" start="2026-04-07T17:21:06.855387" elapsed="0.005022"/>
</for>
<return>
<value>${uuid}</value>
<status status="PASS" start="2026-04-07T17:21:06.860485" elapsed="0.000030"/>
</return>
<arg>controller_http_session=${session}</arg>
<doc>Queries the topology in the operational datastore and searches for the node that has
the ${ovs_system_ip} argument as the "remote-ip". If found, the value returned will be the value of
node-id stripped of "ovsdb://uuid/". If not found,  will be returned.</doc>
<status status="PASS" start="2026-04-07T17:21:06.831164" elapsed="0.029446"/>
</kw>
<msg time="2026-04-07T17:21:06.860690" level="INFO">${ovsdb_uuid} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${ovsdb_uuid}</var>
<arg>30s</arg>
<arg>2s</arg>
<arg>OVSDB.Get OVSDB UUID</arg>
<arg>controller_http_session=${session}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:21:06.824759" elapsed="0.035955"/>
</kw>
<return>
<value>${ovsdb_uuid}</value>
<status status="PASS" start="2026-04-07T17:21:06.860763" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:06.860917" level="INFO">${ovsdb_uuid} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${ovsdb_uuid}</var>
<doc>Connect OVS to the list of controllers in the ${controller_index_list} or all if no list is provided.</doc>
<status status="PASS" start="2026-04-07T17:21:02.289854" elapsed="4.571089"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.861459" level="INFO">${ovsdb_uuid} = e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>${ovsdb_uuid}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="PASS" start="2026-04-07T17:21:06.861124" elapsed="0.000376"/>
</kw>
<doc>Connect OVS to all cluster instances.</doc>
<status status="PASS" start="2026-04-07T17:21:01.973759" elapsed="4.887858"/>
</test>
<test id="s1-s2-s2-t3" name="Check Entity Owner Status And Find Owner and Candidate Before Fail" line="26">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:06.865147" elapsed="0.000219"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:06.864869" elapsed="0.000552"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.866395" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:06.866284" elapsed="0.000158"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.866265" 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-07T17:21:06.871048" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:06.870926" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.870908" elapsed="0.000208"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.872095" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:06.871703" elapsed="0.000419"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.872578" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:06.872276" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:06.872647" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:06.872798" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:06.871334" elapsed="0.001488"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.877899" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:06.877791" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.877773" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.879205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:06.879098" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.879080" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:06.879759" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.879408" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.880216" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:06.879938" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.911650" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:06.880774" elapsed="0.031048"/>
</kw>
<msg time="2026-04-07T17:21:06.912014" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:06.912062" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.880394" elapsed="0.031702"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:06.989720" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:06.912652" elapsed="0.077364"/>
</kw>
<msg time="2026-04-07T17:21:06.990201" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:06.990248" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.912262" elapsed="0.078022"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.990619" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.990372" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.990349" elapsed="0.000373"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:06.991280" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:06.990861" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.991646" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.991436" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.991418" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:06.991778" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:06.994171" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:06.995611" elapsed="0.000519"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:06.997055" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:06.992681" elapsed="0.004771"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:06.992075" elapsed="0.005490"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:06.878770" elapsed="0.118896"/>
</kw>
<msg time="2026-04-07T17:21:06.997756" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:06.997800" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.878129" elapsed="0.119706"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:06.998036" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:06.997912" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.997893" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.998520" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.998855" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:06.998925" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:06.877456" elapsed="0.121593"/>
</kw>
<msg time="2026-04-07T17:21:06.999143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:06.999186" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.873211" elapsed="0.126009"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:06.999539" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:06.999295" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:06.999278" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:06.873053" elapsed="0.126586"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.004870" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:07.004763" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.004745" elapsed="0.000328"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.006278" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:07.006169" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.006151" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:07.006845" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:07.006490" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.007300" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:07.007043" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.039815" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:07.007859" elapsed="0.032148"/>
</kw>
<msg time="2026-04-07T17:21:07.040176" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:07.040221" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.007480" elapsed="0.032776"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.119177" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:07.040808" elapsed="0.078967"/>
</kw>
<msg time="2026-04-07T17:21:07.120161" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:07.120229" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.040422" elapsed="0.079857"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.120919" elapsed="0.000081"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.120449" elapsed="0.000632"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.120394" elapsed="0.000729"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.122000" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:07.121328" elapsed="0.000808"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.122533" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.122231" elapsed="0.000437"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.122204" elapsed="0.000499"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:07.122755" elapsed="0.000053"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:07.126806" elapsed="0.001155"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:07.128999" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:07.130449" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:07.124601" elapsed="0.006259"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:07.123244" elapsed="0.007775"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:07.005844" elapsed="0.125277"/>
</kw>
<msg time="2026-04-07T17:21:07.131220" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:07.131265" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.005231" elapsed="0.126070"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:07.131491" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:07.131382" elapsed="0.000239"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.131362" elapsed="0.000287"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.132091" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.132431" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.132501" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:07.004428" elapsed="0.128183"/>
</kw>
<msg time="2026-04-07T17:21:07.132707" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:07.132751" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.999906" elapsed="0.132880"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.133141" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.132863" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.132845" elapsed="0.000375"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:06.999766" elapsed="0.133479"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.138696" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:07.138588" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.138569" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.140013" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:07.139879" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.139861" elapsed="0.000221"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:07.140594" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:07.140222" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.141049" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:07.140773" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.168627" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:07.141608" elapsed="0.027189"/>
</kw>
<msg time="2026-04-07T17:21:07.168987" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:07.169037" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.141229" elapsed="0.027843"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:07.245037" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:07.169649" elapsed="0.075596"/>
</kw>
<msg time="2026-04-07T17:21:07.245419" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:07.245463" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.169242" elapsed="0.076256"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.245799" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.245576" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.245556" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.246447" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:07.246074" elapsed="0.000510"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.246868" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.246654" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.246635" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:07.247022" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:07.249355" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:21:07.250801" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:07.252210" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:07.247877" elapsed="0.004723"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:07.247296" elapsed="0.005417"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:07.139579" elapsed="0.113238"/>
</kw>
<msg time="2026-04-07T17:21:07.252909" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:07.252953" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.138938" elapsed="0.114067"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:07.253190" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:07.253083" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.253065" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.253655" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.254244" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.254321" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:07.138230" elapsed="0.116198"/>
</kw>
<msg time="2026-04-07T17:21:07.254520" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:07.254563" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.133527" elapsed="0.121071"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.254921" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:07.254671" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.254655" elapsed="0.000361"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:07.133386" elapsed="0.121653"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:06.872873" elapsed="0.382197"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:06.870566" elapsed="0.384569"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:06.865997" elapsed="0.389203"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:06.865563" elapsed="0.389693"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:06.862551" elapsed="0.392766"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:21:07.289614" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:07.289216" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.290134" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:07.289808" elapsed="0.000351"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:07.290205" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:07.290420" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:07.288830" elapsed="0.001615"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:07.294962" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:07.294779" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:07.295387" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.295150" elapsed="0.000439">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.295753" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.295940" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296116" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296275" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296452" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296613" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296785" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.296942" elapsed="0.000035"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.306888" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.307095" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.316861" 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-07T17:21:07.317070" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.317138" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.294247" elapsed="0.023017">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:07.317374" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:07.317418" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.293666" elapsed="0.023783"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.317645" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:07.317532" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:07.317514" 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-07T17:21:07.319029" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.319753" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:07.319392" elapsed="0.000386"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:07.320583" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:07.320323" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:07.320656" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:07.320802" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:07.319984" elapsed="0.000842"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.321366" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:07.320999" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.321908" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:07.321566" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:07.322358" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:07.334256" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:07.322111" elapsed="0.013974">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.336269" 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-07T17:21:07.336437" 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-07T17:21:07.336599" 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-07T17:21:07.336762" 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-07T17:21:07.336933" 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-07T17:21:07.337109" 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-07T17:21:07.337396" 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-07T17:21:07.337564" 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-07T17:21:07.337722" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:07.337255" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.337183" 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-07T17:21:07.337940" elapsed="0.000037"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.338018" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.318480" elapsed="0.019646">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:07.338239" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:07.338282" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:07.317856" elapsed="0.020449"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:07.338916" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.338597" elapsed="0.000394">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:07.338386" elapsed="0.000668">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:07.338368" elapsed="0.000761">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.339180" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.293116" elapsed="0.046164">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.339454" 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-07T17:21:07.339618" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.339679" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:07.290744" elapsed="0.049034">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:07.339942" 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-07T17:21:07.340138" 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-07T17:21:07.340304" 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-07T17:21:07.340462" 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-07T17:21:07.340626" 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-07T17:21:07.340786" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:07.340846" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.288171" elapsed="0.052772">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:08.371101" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:08.370572" elapsed="0.000564"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:08.371620" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:08.371306" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:08.371695" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:21:08.371879" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:08.370187" 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-07T17:21:08.376453" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:08.376263" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:08.376870" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.376629" elapsed="0.000419">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.377216" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.377422" elapsed="0.000030"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.377590" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.377748" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.377931" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.378123" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.378300" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.378457" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.388216" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.388411" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.399037" 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-07T17:21:08.399230" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.399295" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.375716" elapsed="0.023700">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:08.399529" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:08.399572" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:08.375161" elapsed="0.024434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.399802" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:08.399684" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:08.399663" 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-07T17:21:08.401180" elapsed="0.000223"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:08.401864" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:08.401553" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:08.402932" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:08.402583" elapsed="0.000402"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:08.403047" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:21:08.403201" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:08.402093" elapsed="0.001132"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:08.403751" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:08.403383" elapsed="0.000394"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:08.404363" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:08.404008" elapsed="0.000381"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:08.404782" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:08.414105" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:08.404548" elapsed="0.011298">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.416053" 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-07T17:21:08.416223" 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-07T17:21:08.416384" 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-07T17:21:08.416544" 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-07T17:21:08.416710" 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-07T17:21:08.416868" 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-07T17:21:08.417185" 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-07T17:21:08.417356" 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-07T17:21:08.417513" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:08.417030" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.416940" 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-07T17:21:08.417732" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.417790" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.400631" elapsed="0.017280">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:08.418217" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:08.418321" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:08.400028" elapsed="0.018349"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:08.419877" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.419114" elapsed="0.000940">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:08.418571" elapsed="0.001634">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:08.418529" elapsed="0.001752">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.420386" elapsed="0.000037"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.374606" elapsed="0.046012">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.421162" elapsed="0.000055"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.421559" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.421705" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:08.372216" elapsed="0.049728">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.422378" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.422793" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.423223" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.423603" elapsed="0.000046"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.424040" elapsed="0.000055"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:08.424439" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:08.424584" elapsed="0.000036"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:08.369374" elapsed="0.055446">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:09.454265" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:09.453732" elapsed="0.000569"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:09.454816" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:09.454496" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:09.454889" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:21:09.455088" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:09.453336" 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-07T17:21:09.460122" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:09.459915" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:09.460546" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.460300" elapsed="0.000330">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.460792" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461019" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461175" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461330" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461588" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461751" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.461924" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.462098" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.471830" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.472035" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.481723" 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-07T17:21:09.481911" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.481992" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.459384" elapsed="0.022727">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:09.482233" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:09.482276" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:09.458802" elapsed="0.023496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.482503" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:09.482386" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:09.482365" 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-07T17:21:09.483903" elapsed="0.000228"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:09.484593" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:09.484282" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:09.485419" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:09.485156" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:09.485493" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:09.485640" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:09.484799" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:09.486213" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:09.485819" elapsed="0.000420"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:09.486731" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:09.486390" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:09.487167" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:09.497036" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:09.486914" elapsed="0.011908">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.499240" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.499619" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.500009" elapsed="0.000049"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.500379" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.500756" 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-07T17:21:09.501140" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.501729" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.502153" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.502510" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:09.501449" elapsed="0.001178"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.501295" elapsed="0.001392"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.503023" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.503158" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.483370" elapsed="0.020031">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:09.503649" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:09.503745" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:09.482715" elapsed="0.021082"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:09.505273" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.504513" elapsed="0.000893">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:09.504014" elapsed="0.001528">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:09.503942" elapsed="0.001669">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.505743" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.458113" elapsed="0.047851">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.506393" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.506751" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.506885" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:09.455409" elapsed="0.051774">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.507696" elapsed="0.000049"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.508117" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.508484" elapsed="0.000045"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.508829" elapsed="0.000044"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:09.509216" 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-07T17:21:09.509571" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:09.509706" elapsed="0.000032"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:09.452535" elapsed="0.057387">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:10.541023" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:10.540436" elapsed="0.000622"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:10.541582" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:10.541249" elapsed="0.000359"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:10.541658" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:21:10.541845" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:10.539860" elapsed="0.002010"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:10.546820" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:10.546619" elapsed="0.000228"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:10.547508" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.547013" elapsed="0.000577">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.547758" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.547995" elapsed="0.000025"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.548172" elapsed="0.000024"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.548340" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.548518" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.548680" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.548854" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.549030" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.559054" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.559354" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.569602" 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-07T17:21:10.569805" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.569874" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.546055" elapsed="0.023965">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:10.570139" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:10.570192" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:10.545210" elapsed="0.025007"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.570433" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:10.570311" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:10.570288" 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-07T17:21:10.571862" elapsed="0.000241"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:10.572583" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:10.572265" elapsed="0.000344"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:10.573462" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:10.573189" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:10.573536" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:10.573686" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:10.572808" elapsed="0.000902"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:10.574282" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:10.573867" elapsed="0.000441"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:10.574817" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:10.574464" elapsed="0.000381"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:10.575284" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:10.585808" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:10.575029" elapsed="0.014704">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.590260" elapsed="0.000061"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.590664" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.591069" elapsed="0.000049"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.591464" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.591871" elapsed="0.000049"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.592334" elapsed="0.000051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.593080" elapsed="0.000060"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.593513" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.593875" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:10.592732" elapsed="0.001296"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.592573" elapsed="0.001520"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.594423" elapsed="0.000049"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.594561" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.571303" elapsed="0.023511">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:10.595119" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:10.595246" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:10.570649" elapsed="0.024656"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:10.598571" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.596066" elapsed="0.002569">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:10.595500" elapsed="0.003199">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:10.595455" elapsed="0.003278">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.598779" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.544621" elapsed="0.054257">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.599073" 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-07T17:21:10.599250" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.599317" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:10.542207" elapsed="0.057212">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:10.599583" 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-07T17:21:10.599772" 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-07T17:21:10.599940" 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-07T17:21:10.600119" 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-07T17:21:10.600293" 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-07T17:21:10.600457" elapsed="0.000053"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:10.600555" elapsed="0.000017"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:10.539060" elapsed="0.061597">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:11.630678" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:11.630189" elapsed="0.000522"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:11.631213" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:11.630879" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:11.631287" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:21:11.631458" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:11.629787" 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-07T17:21:11.636094" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:11.635888" elapsed="0.000232"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:11.636498" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.636268" elapsed="0.000303">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.636732" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.636991" elapsed="0.000025"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.637156" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.637316" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.637496" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.637681" elapsed="0.000025"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.637892" elapsed="0.000025"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.638096" elapsed="0.000025"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.648582" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.648778" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.658806" 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-07T17:21:11.659013" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.659161" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.635354" elapsed="0.023926">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:11.659394" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:11.659437" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:11.634773" elapsed="0.024686"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.659668" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:11.659550" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:11.659529" 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-07T17:21:11.661061" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:11.661735" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:11.661425" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:11.662575" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:11.662301" elapsed="0.000300"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:11.662648" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:11.662796" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:11.661950" elapsed="0.000870"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:11.663398" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:11.662992" elapsed="0.000432"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:11.663921" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:11.663580" elapsed="0.000367"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:11.664446" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:11.674424" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:11.664122" elapsed="0.012090">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.676394" 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-07T17:21:11.676561" 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-07T17:21:11.676723" 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-07T17:21:11.676883" 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-07T17:21:11.677065" 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-07T17:21:11.677224" 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-07T17:21:11.677493" 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-07T17:21:11.677659" 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-07T17:21:11.677815" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:11.677368" elapsed="0.000499"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.677295" elapsed="0.000598"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.678044" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.678103" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.660509" elapsed="0.017739">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:11.678392" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:11.678435" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:11.659884" elapsed="0.018574"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:11.679174" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.678753" elapsed="0.000509">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:11.678541" elapsed="0.000808">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:11.678523" elapsed="0.000871">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.679456" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.634206" elapsed="0.045384">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.679829" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.680077" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.680166" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:11.631782" elapsed="0.048521">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.680531" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.680772" 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-07T17:21:11.681025" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:11.681246" 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-07T17:21:11.681468" 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-07T17:21:11.681686" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:11.681771" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:11.629036" elapsed="0.052871">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:12.713263" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:12.712797" elapsed="0.000498"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:12.713792" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:12.713457" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:12.713866" elapsed="0.000038"/>
</return>
<msg time="2026-04-07T17:21:12.714053" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:12.712352" 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-07T17:21:12.718673" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:12.718484" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:12.719103" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.718858" elapsed="0.000319">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.719338" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.719535" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.719689" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.719847" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.720048" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.720208" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.720380" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.720535" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.730419" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.730614" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.740315" 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-07T17:21:12.740506" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.740572" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.717933" elapsed="0.022756">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:12.740801" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:12.740844" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:12.717355" elapsed="0.023512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.741120" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:12.740954" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:12.740934" 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-07T17:21:12.742524" elapsed="0.000211"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:12.743219" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:12.742886" elapsed="0.000361"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:12.744212" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:12.743769" elapsed="0.000470"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:12.744288" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:12.744437" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:12.743432" elapsed="0.001030"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:12.744999" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:12.744618" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:12.745551" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:12.745181" elapsed="0.000398"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:12.745984" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:12.756428" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:12.745739" elapsed="0.013115">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.759167" 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-07T17:21:12.759421" 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-07T17:21:12.759646" 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-07T17:21:12.759872" 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-07T17:21:12.760124" 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-07T17:21:12.760347" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.760713" 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-07T17:21:12.760944" 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-07T17:21:12.761235" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:12.760540" elapsed="0.000769"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.760442" elapsed="0.000904"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.761560" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.761644" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.741980" elapsed="0.019815">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:12.761953" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:12.762043" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:12.741338" elapsed="0.020738"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:12.763014" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.762537" elapsed="0.000585">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:12.762241" elapsed="0.000989">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:12.762215" elapsed="0.001065">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.763343" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.716792" elapsed="0.046688">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.763720" 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-07T17:21:12.763944" elapsed="0.000048"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.764052" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:12.714376" elapsed="0.049815">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.764417" 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-07T17:21:12.764657" 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-07T17:21:12.764885" 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-07T17:21:12.765122" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:12.765346" 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-07T17:21:12.765595" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:12.765681" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:12.711642" elapsed="0.054177">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:13.796803" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:13.796345" elapsed="0.000490"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:13.797333" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:13.797016" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:13.797407" elapsed="0.000050"/>
</return>
<msg time="2026-04-07T17:21:13.797591" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:13.795945" 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-07T17:21:13.802521" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:13.802331" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:13.802928" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.802693" elapsed="0.000326">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.803181" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.803383" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.803539" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.803698" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.803878" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.804051" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.804227" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.804383" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.814142" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.814333" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.824021" 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-07T17:21:13.824216" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.824282" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.801776" elapsed="0.022622">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:13.824509" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:13.824552" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:13.801192" elapsed="0.023383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.824776" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:13.824660" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:13.824641" 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-07T17:21:13.826188" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:13.826854" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:13.826545" elapsed="0.000334"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:13.827677" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:13.827415" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:13.827788" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:13.827939" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:13.827081" elapsed="0.000883"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:13.828508" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:13.828141" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:13.829052" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:13.828688" elapsed="0.000391"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:13.829479" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:13.840690" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:13.829237" elapsed="0.014152">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.843665" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.843901" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.844162" elapsed="0.000030"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.844390" 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-07T17:21:13.844619" 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-07T17:21:13.844840" 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-07T17:21:13.845277" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.845511" 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-07T17:21:13.845726" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:13.845087" elapsed="0.000712"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.844946" elapsed="0.000889"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.846050" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.846136" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.825634" elapsed="0.020660">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:13.846459" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:13.846522" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:13.825004" elapsed="0.021550"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:13.847429" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.846958" elapsed="0.000552">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:13.846667" elapsed="0.000930">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:13.846642" elapsed="0.000998">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.847702" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.800631" elapsed="0.047204">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.848159" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.848388" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.848473" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:13.798010" elapsed="0.050611">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.848851" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.849112" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:13.849377" 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-07T17:21:13.849596" 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-07T17:21:13.849820" 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-07T17:21:13.850073" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:13.850172" elapsed="0.000018"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:13.795229" elapsed="0.055059">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:14.886165" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:14.885612" elapsed="0.000590"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:14.886694" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:14.886375" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:14.886769" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:21:14.886957" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:14.885198" 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-07T17:21:14.891616" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:14.891417" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:14.892056" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.891791" elapsed="0.000602">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.892559" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.892781" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.892937" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.893112" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.893380" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.893544" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.893729" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.893888" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.903772" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.903985" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.914028" elapsed="0.000040"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.914277" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.914348" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.890861" elapsed="0.023625">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:14.914620" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:14.914666" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:14.890298" elapsed="0.024390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.914946" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:14.914797" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:14.914770" elapsed="0.000282"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:14.916477" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:14.917212" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:14.916841" elapsed="0.000399"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:14.918073" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:14.917774" elapsed="0.000329"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:14.918151" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:14.918304" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:14.917424" elapsed="0.000904"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:14.918858" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:14.918485" elapsed="0.000399"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:14.919418" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:14.919067" elapsed="0.000377"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:14.919847" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:14.933760" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:14.919604" elapsed="0.017936">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.938073" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.938455" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.938855" elapsed="0.000052"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.939300" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.939684" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.940093" elapsed="0.000051"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.940708" 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-07T17:21:14.941137" 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-07T17:21:14.941528" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:14.940426" elapsed="0.001222"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.940260" elapsed="0.001449"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.942064" elapsed="0.000061"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.942232" elapsed="0.000039"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.915863" elapsed="0.026666">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:14.942791" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:14.942889" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:14.915235" elapsed="0.027705"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:14.945004" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.943689" elapsed="0.001504">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:14.943192" elapsed="0.002152">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:14.943146" elapsed="0.002271">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.945573" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.889736" elapsed="0.056071">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.946238" 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-07T17:21:14.946431" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.946510" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:14.887304" elapsed="0.059317">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.946846" elapsed="0.000027"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:14.947070" 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-07T17:21:14.947250" 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-07T17:21:14.947406" 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-07T17:21:14.947566" 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-07T17:21:14.947723" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:14.947782" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:14.884321" elapsed="0.063562">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:15.982253" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:15.981629" elapsed="0.000660"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:15.982883" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:15.982545" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:15.982959" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:21:15.983167" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:15.981229" elapsed="0.001964"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:15.987871" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:15.987680" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:15.988413" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:15.988059" elapsed="0.000435">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.988659" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.988863" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989034" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989194" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989370" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989530" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989700" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:15.989855" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.003780" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.004091" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.013891" 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-07T17:21:16.014103" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.014172" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:15.987125" elapsed="0.027206">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:16.014447" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:16.014489" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:15.986520" elapsed="0.027993"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.014732" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:16.014609" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:16.014588" 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-07T17:21:16.016151" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:16.016835" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:16.016520" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:16.017670" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:16.017408" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:16.017743" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:16.017893" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:16.017065" elapsed="0.000853"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:16.018499" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:16.018091" elapsed="0.000434"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:16.019049" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:16.018680" elapsed="0.000395"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:16.019468" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:16.030287" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:16.019234" elapsed="0.012818">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.032238" 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-07T17:21:16.032409" 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-07T17:21:16.032571" 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-07T17:21:16.032735" 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-07T17:21:16.032903" 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-07T17:21:16.033079" 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-07T17:21:16.033403" 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-07T17:21:16.033573" 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-07T17:21:16.033731" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:16.033275" elapsed="0.000510"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.033197" 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-07T17:21:16.033951" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.034028" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:16.015584" elapsed="0.018554">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:16.034290" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:16.034333" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:16.014949" elapsed="0.019408"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:16.034986" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:16.034653" elapsed="0.000395">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:16.034441" elapsed="0.000692">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:16.034422" elapsed="0.000757">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.035241" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:15.985924" elapsed="0.049453">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.035617" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.035841" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.035924" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:15.983497" elapsed="0.052592">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.036316" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.036556" 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-07T17:21:16.036783" 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-07T17:21:16.037020" elapsed="0.000030"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:16.037252" 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-07T17:21:16.037470" elapsed="0.000080"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:16.037613" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:15.980423" elapsed="0.057329">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:17.070584" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:17.070094" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:17.071123" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:17.070787" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:17.071197" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:21:17.071390" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:17.069695" 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-07T17:21:17.076243" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:17.076052" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:17.076648" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.076415" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.076881" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077099" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077255" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077411" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077587" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077749" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.077919" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.078092" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.087879" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.088085" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.097942" 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-07T17:21:17.098145" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.098280" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.075502" elapsed="0.022898">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:17.098513" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:17.098556" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:17.074904" elapsed="0.023675"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.098785" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:17.098668" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:17.098647" 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-07T17:21:17.100189" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:17.100857" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:17.100549" elapsed="0.000335"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:17.101838" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:17.101570" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:17.101913" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:17.102078" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:17.101082" elapsed="0.001021"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:17.102621" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:17.102259" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:17.103159" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:17.102799" elapsed="0.000386"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:17.103584" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:17.113776" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:17.103354" elapsed="0.013818">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.117576" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.117949" elapsed="0.000079"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.118347" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.118702" 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-07T17:21:17.119104" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.119513" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.120132" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.120506" 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-07T17:21:17.120856" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:17.119820" elapsed="0.001180"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.119668" elapsed="0.001394"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.121367" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.121498" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.099634" elapsed="0.022182">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:17.122104" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:17.122209" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:17.099019" elapsed="0.023242"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:17.123697" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.122914" elapsed="0.000917">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:17.122447" elapsed="0.001559">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:17.122407" elapsed="0.001675">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.124200" elapsed="0.000039"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.074364" elapsed="0.050014">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.124558" 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-07T17:21:17.124719" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.124781" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:17.071748" elapsed="0.053131">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:17.125058" 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-07T17:21:17.125232" 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-07T17:21:17.125396" 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-07T17:21:17.125552" 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-07T17:21:17.125712" 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-07T17:21:17.125868" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:17.125929" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:17.068918" elapsed="0.057124">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:18.158467" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:18.158000" elapsed="0.000499"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:18.159001" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:18.158666" elapsed="0.000363"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:18.159077" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:18.159251" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:18.157517" 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-07T17:21:18.164073" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:18.163868" elapsed="0.000231"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:18.164480" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.164246" elapsed="0.000306">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.164712" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.164926" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165096" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165253" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165427" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165584" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165755" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.165909" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.175623" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.175812" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.185712" 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-07T17:21:18.185901" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.185980" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.163330" elapsed="0.022772">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:18.186214" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:18.186272" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:18.162758" elapsed="0.023537"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.186579" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:18.186383" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:18.186363" elapsed="0.000287"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:18.187955" elapsed="0.000224"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:18.188635" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:18.188329" elapsed="0.000332"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:18.189482" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:18.189222" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:18.189557" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:18.189704" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:18.188870" elapsed="0.000858"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:18.190268" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:18.189882" elapsed="0.000412"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:18.190787" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:18.190446" elapsed="0.000366"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:18.191215" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:18.205548" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:18.190984" elapsed="0.017325">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.208586" 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-07T17:21:18.208863" 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-07T17:21:18.209124" 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-07T17:21:18.209367" 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-07T17:21:18.209613" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.209847" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.210253" 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-07T17:21:18.210505" 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-07T17:21:18.210737" elapsed="0.000031"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:18.210068" elapsed="0.000749"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.209945" elapsed="0.000911"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.211081" elapsed="0.000031"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.211170" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.187421" elapsed="0.023909">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:18.211501" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:18.211567" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:18.186800" elapsed="0.024802"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:18.212586" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.212112" elapsed="0.000579">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:18.211775" elapsed="0.001010">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:18.211748" elapsed="0.001085">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.212901" elapsed="0.000023"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.162214" elapsed="0.050851">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.213324" elapsed="0.000032"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.213566" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.213658" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:18.159572" elapsed="0.054229">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.214061" elapsed="0.000032"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.214323" 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-07T17:21:18.214569" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:18.214802" 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-07T17:21:18.215067" 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-07T17:21:18.215309" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:18.215400" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:18.156770" elapsed="0.058774">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:19.248161" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:19.247622" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:19.248696" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:19.248374" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:19.248772" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:21:19.248981" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:19.247208" elapsed="0.001801"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:19.253861" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:19.253661" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:19.254326" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.254070" elapsed="0.000339">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.254842" elapsed="0.000024"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255088" elapsed="0.000023"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255252" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255415" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255595" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255761" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.255939" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.256125" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.266254" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.266467" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.276411" 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-07T17:21:19.276608" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.276675" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.253078" elapsed="0.023723">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:19.276918" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:19.276964" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:19.252477" elapsed="0.024527"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.277221" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:19.277095" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:19.277074" 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-07T17:21:19.278840" elapsed="0.000247"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:19.279614" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:19.279270" elapsed="0.000371"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:19.280464" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:19.280186" elapsed="0.000305"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:19.280599" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:19.280756" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:19.279828" elapsed="0.000953"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:19.281334" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:19.280941" elapsed="0.000424"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:19.281885" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:19.281534" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:19.282329" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:19.292683" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:19.282090" elapsed="0.014070">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.296578" elapsed="0.000063"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.297013" elapsed="0.000049"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.297386" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.297774" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.298208" 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-07T17:21:19.298597" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.299253" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.299633" 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-07T17:21:19.300038" elapsed="0.000159"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:19.298936" elapsed="0.001341"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.298772" elapsed="0.001567"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.300686" elapsed="0.000057"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.300840" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.278089" elapsed="0.023041">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:19.301394" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:19.301493" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:19.277452" elapsed="0.024095"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:19.303112" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.302271" elapsed="0.000995">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:19.301731" elapsed="0.001635">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:19.301689" elapsed="0.001719">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.303455" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.251847" elapsed="0.051708">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.303783" 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-07T17:21:19.303983" elapsed="0.000024"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.304051" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:19.249419" elapsed="0.054734">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:19.304320" 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-07T17:21:19.304499" 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-07T17:21:19.304665" 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-07T17:21:19.304827" 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-07T17:21:19.305012" 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-07T17:21:19.305174" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:19.305235" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:19.246340" elapsed="0.058995">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:20.336781" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:20.336222" elapsed="0.000602"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:20.337380" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:20.337044" elapsed="0.000362"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:20.337454" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:21:20.337633" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:20.335812" elapsed="0.001846"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:20.342290" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:20.342101" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:20.342698" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.342463" elapsed="0.000309">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.342932" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.343154" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.343310" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.343469" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.343723" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.343885" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.344076" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.344236" elapsed="0.000023"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.354313" elapsed="0.000032"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.354513" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.364527" 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-07T17:21:20.364721" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.364788" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.341549" elapsed="0.023360">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:20.365038" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:20.365081" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:20.340986" elapsed="0.024118"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.365310" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:20.365193" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:20.365172" 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-07T17:21:20.366681" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:20.367466" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:20.367147" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:20.368521" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:20.368037" elapsed="0.000516"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:20.368611" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:21:20.368786" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:20.367676" elapsed="0.001138"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:20.369365" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:20.368990" elapsed="0.000401"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:20.369892" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:20.369547" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:20.370331" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:20.381836" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:20.370093" elapsed="0.015180">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.385813" elapsed="0.000053"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.386239" elapsed="0.000055"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.386633" 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-07T17:21:20.387035" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.387419" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.387781" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.388418" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.388794" 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-07T17:21:20.389188" elapsed="0.000052"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:20.388112" elapsed="0.001214"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.387929" elapsed="0.001466"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.389714" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.389846" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.366144" elapsed="0.023990">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:20.390418" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:20.390518" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:20.365524" elapsed="0.025047"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:20.392081" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.391337" elapsed="0.000880">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:20.390756" elapsed="0.001661">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:20.390714" elapsed="0.001779">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.392596" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.340424" elapsed="0.052390">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.393236" elapsed="0.000057"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.393488" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.393548" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:20.337957" elapsed="0.055688">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:20.393854" 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-07T17:21:20.394044" 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-07T17:21:20.394212" 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-07T17:21:20.394369" 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-07T17:21:20.394532" 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-07T17:21:20.394690" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:20.394750" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:20.335055" elapsed="0.059793">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:21.425742" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:21.425132" elapsed="0.000643"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:21.426297" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:21.425942" elapsed="0.000381"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:21.426371" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:21:21.426561" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:21.424724" elapsed="0.001863"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:21.431450" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:21.431261" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:21.431853" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.431625" elapsed="0.000299">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432102" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432307" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432463" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432625" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432804" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.432978" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.433156" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.433312" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.443082" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.443349" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.453081" 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-07T17:21:21.453275" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.453342" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.430696" elapsed="0.022764">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:21.453572" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:21.453615" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:21.430122" elapsed="0.023516"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.453843" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:21.453725" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:21.453706" 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-07T17:21:21.455257" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:21.455931" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:21.455621" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:21.456755" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:21.456492" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:21.456830" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:21.456992" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:21.456156" elapsed="0.000862"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:21.457542" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:21.457176" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:21.458080" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:21.457720" elapsed="0.000386"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:21.458519" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:21.469179" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:21.458268" elapsed="0.014858">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.473535" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.473912" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.474308" 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-07T17:21:21.474697" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.475108" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.475473" elapsed="0.000046"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.476173" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.476552" 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-07T17:21:21.476902" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:21.475860" elapsed="0.001190"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.475701" elapsed="0.001413"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.477449" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.477583" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.454697" elapsed="0.023140">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:21.478127" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:21.478224" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:21.454075" elapsed="0.024205"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:21.479460" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.479014" elapsed="0.000505">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:21.478511" elapsed="0.001070">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:21.478467" elapsed="0.001146">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.479659" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.429558" elapsed="0.050198">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.479931" 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-07T17:21:21.480111" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.480173" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:21.426884" elapsed="0.053388">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:21.480436" 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-07T17:21:21.480610" 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-07T17:21:21.480777" 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-07T17:21:21.480936" 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-07T17:21:21.481117" 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-07T17:21:21.481276" elapsed="0.000059"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:21.481380" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:21.423929" elapsed="0.057550">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:22.514811" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:22.514154" elapsed="0.000692"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:22.515355" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:22.515037" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:22.515430" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:21:22.515600" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:22.513749" elapsed="0.001876"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:22.520182" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:22.519992" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:22.520585" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.520354" elapsed="0.000547">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.521084" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.521287" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.521458" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.521778" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.521961" elapsed="0.000040"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.522155" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.522331" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.522489" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.532480" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.532675" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.542568" 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-07T17:21:22.542757" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.542887" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.519444" elapsed="0.023577">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:22.543136" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:22.543179" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:22.518872" elapsed="0.024330"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.543407" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:22.543289" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:22.543269" 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-07T17:21:22.544808" elapsed="0.000229"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:22.545532" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:22.545187" elapsed="0.000371"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:22.546349" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:22.546086" elapsed="0.000288"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:22.546421" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:22.546568" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:22.545738" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:22.547127" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:22.546745" elapsed="0.000408"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:22.547689" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:22.547318" elapsed="0.000397"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:22.548114" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:22.557347" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:22.547872" elapsed="0.011310">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.559383" 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-07T17:21:22.559551" 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-07T17:21:22.559712" 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-07T17:21:22.559874" 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-07T17:21:22.560056" 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-07T17:21:22.560217" 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-07T17:21:22.560489" 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-07T17:21:22.560655" 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-07T17:21:22.560840" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:22.560364" elapsed="0.000530"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.560288" 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-07T17:21:22.561073" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.561134" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.544248" elapsed="0.017054">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:22.561490" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:22.561551" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:22.543621" elapsed="0.017963"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:22.562483" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.562023" elapsed="0.000543">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:22.561703" elapsed="0.000950">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:22.561677" elapsed="0.001021">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.562760" elapsed="0.000354"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.518332" elapsed="0.044909">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.563544" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.563768" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.563853" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:22.515923" elapsed="0.048087">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.564241" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.564480" 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-07T17:21:22.564708" elapsed="0.000044"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.564948" elapsed="0.000045"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.565193" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:22.565415" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:22.565499" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:22.512988" elapsed="0.052648">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:23.596111" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:23.595620" elapsed="0.000525"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:23.596632" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:23.596313" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:23.596708" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:23.596883" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:23.595114" elapsed="0.001794"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:23.601487" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:23.601300" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:23.601894" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.601660" elapsed="0.000323">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.602148" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.602348" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.602502" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.602657" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.602833" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.603007" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.603181" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.603358" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.613309" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.613503" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.623454" 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-07T17:21:23.623662" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.623729" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.600750" elapsed="0.023100">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:23.623964" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:23.624023" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:23.600191" elapsed="0.023854"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.624301" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:23.624139" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:23.624118" elapsed="0.000255"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:23.625684" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:23.626371" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:23.626060" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:23.627188" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:23.626912" elapsed="0.000495"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:23.627462" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:23.627615" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:23.626580" elapsed="0.001064"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:23.628189" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:23.627800" elapsed="0.000415"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:23.628713" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:23.628370" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:23.629146" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:23.638739" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:23.628895" elapsed="0.012009">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.641344" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.641717" 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-07T17:21:23.642102" 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-07T17:21:23.642462" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.642831" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.643210" elapsed="0.000063"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.643815" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.644228" 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-07T17:21:23.644583" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:23.643539" elapsed="0.001162"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.643377" elapsed="0.001384"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.645090" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.645224" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.625143" elapsed="0.020321">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:23.645716" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:23.645813" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:23.624522" elapsed="0.021342"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:23.647408" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.646637" elapsed="0.000910">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:23.646160" elapsed="0.001524">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:23.646118" elapsed="0.001639">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.647858" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.599628" elapsed="0.048481">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.648498" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.648859" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.649025" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:23.597225" elapsed="0.052025">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.649610" elapsed="0.000046"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.650020" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.650389" elapsed="0.000045"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.650732" elapsed="0.000045"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.651117" elapsed="0.000047"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:23.651526" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:23.651667" elapsed="0.000033"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:23.594312" elapsed="0.057575">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:24.680957" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:24.680461" elapsed="0.000546"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:24.681491" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:24.681178" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:24.681565" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:24.681745" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:24.680063" 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-07T17:21:24.686443" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:24.686248" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:24.686859" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.686622" elapsed="0.000316">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687117" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687325" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687479" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687635" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687810" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.687980" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.688156" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.688312" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.698360" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.698553" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.708223" 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-07T17:21:24.708417" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.708484" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.685690" elapsed="0.022917">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:24.708719" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:24.708762" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:24.685126" elapsed="0.023659"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.709006" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:24.708873" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:24.708852" 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-07T17:21:24.710394" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:24.711079" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:24.710753" elapsed="0.000352"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:24.712064" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:24.711780" elapsed="0.000311"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:24.712194" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:24.712347" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:24.711286" elapsed="0.001085"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:24.712892" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:24.712525" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:24.713431" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:24.713088" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:24.713862" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:24.723286" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:24.713615" elapsed="0.011461">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.725260" 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-07T17:21:24.725433" 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-07T17:21:24.725593" 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-07T17:21:24.725754" 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-07T17:21:24.725951" 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-07T17:21:24.726169" 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-07T17:21:24.726491" 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-07T17:21:24.726659" 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-07T17:21:24.726817" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:24.726337" elapsed="0.000533"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.726250" 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-07T17:21:24.727053" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.727123" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.709825" elapsed="0.017412">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:24.727364" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:24.727407" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:24.709223" elapsed="0.018207"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:24.728084" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.727729" elapsed="0.000418">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:24.727515" elapsed="0.000696">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:24.727496" elapsed="0.000747">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.728288" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.684569" elapsed="0.043820">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.728662" 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-07T17:21:24.728865" elapsed="0.000023"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.728931" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:24.682187" elapsed="0.046873">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:24.729270" 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-07T17:21:24.729530" 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-07T17:21:24.729756" 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-07T17:21:24.730015" 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-07T17:21:24.730226" 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-07T17:21:24.730427" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:24.730504" elapsed="0.000018"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:24.679274" elapsed="0.051353">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:25.761172" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:25.760660" elapsed="0.000546"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:25.761689" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:25.761375" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:25.761762" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:25.761939" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:25.760259" 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-07T17:21:25.766810" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:25.766621" elapsed="0.000215"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:25.767231" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.766997" elapsed="0.000310">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.767467" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.767673" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.767826" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.767998" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.768249" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.768411" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.768583" elapsed="0.000032"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.768756" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.778513" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.778706" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.788464" 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-07T17:21:25.788679" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.788748" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.766088" elapsed="0.022777">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:25.788997" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:25.789041" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:25.765516" elapsed="0.023548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.789273" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:25.789153" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:25.789132" 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-07T17:21:25.790648" elapsed="0.000216"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:25.791342" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:25.791029" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:25.792166" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:25.791887" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:25.792241" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:25.792387" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:25.791555" elapsed="0.000856"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:25.792938" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:25.792564" elapsed="0.000419"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:25.793485" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:25.793139" elapsed="0.000372"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:25.793895" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:25.805417" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:25.793667" elapsed="0.013539">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.807439" 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-07T17:21:25.807608" 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-07T17:21:25.807767" 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-07T17:21:25.807927" 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-07T17:21:25.808111" 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-07T17:21:25.808270" 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-07T17:21:25.808542" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.808741" 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-07T17:21:25.808900" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:25.808417" elapsed="0.000535"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.808339" elapsed="0.000656"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.809133" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.809191" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.790112" elapsed="0.019189">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:25.809436" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:25.809541" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:25.789487" elapsed="0.020106"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:25.811041" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.810275" elapsed="0.000906">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:25.809775" elapsed="0.001544">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:25.809735" elapsed="0.001655">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.811495" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.764949" elapsed="0.046762">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.812120" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.812502" elapsed="0.000051"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.812669" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:25.762284" elapsed="0.050605">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.813373" elapsed="0.000054"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.813782" 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-07T17:21:25.814177" elapsed="0.000046"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.814548" elapsed="0.000046"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.814912" elapsed="0.000044"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:25.815300" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:25.815435" elapsed="0.000032"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:25.759490" elapsed="0.056163">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:26.846742" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:26.845995" elapsed="0.000780"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:26.847282" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:26.846943" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:26.847356" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:26.847549" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:26.845566" elapsed="0.002008"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:26.852175" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:26.851963" elapsed="0.000239"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:26.852593" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.852350" elapsed="0.000322">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853092" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853306" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853461" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853620" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853798" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.853959" elapsed="0.000035"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.854150" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.854306" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.864168" elapsed="0.000026"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.864434" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.874202" 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-07T17:21:26.874396" elapsed="0.000024"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.874469" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.851400" elapsed="0.023191">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:26.874705" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:26.874747" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:26.850822" elapsed="0.023949"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.874995" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:26.874859" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:26.874839" elapsed="0.000251"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:26.876464" elapsed="0.000212"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:26.877184" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:26.876829" elapsed="0.000382"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:26.878060" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:26.877753" elapsed="0.000335"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:26.878136" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:26.878298" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:26.877416" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:26.878863" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:26.878490" elapsed="0.000399"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:26.879480" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:26.879061" elapsed="0.000454"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:26.879919" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:26.891588" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:26.879681" elapsed="0.015756">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.895842" 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-07T17:21:26.896253" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.896613" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.897000" elapsed="0.000049"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.897380" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.897732" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.898432" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.898804" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.899183" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:26.898150" elapsed="0.001152"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.897959" elapsed="0.001403"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.899715" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.899847" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.875903" elapsed="0.024215">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:26.900374" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:26.900475" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:26.875252" elapsed="0.025276"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:26.901162" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.900829" elapsed="0.000392">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:26.900617" elapsed="0.000666">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:26.900599" elapsed="0.000716">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.901360" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.850265" elapsed="0.051193">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.901629" 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-07T17:21:26.901788" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.901848" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:26.847874" elapsed="0.054072">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:26.902124" 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-07T17:21:26.902296" 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-07T17:21:26.902459" 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-07T17:21:26.902615" 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-07T17:21:26.902774" 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-07T17:21:26.902930" elapsed="0.000077"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:26.903053" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:26.844789" elapsed="0.058364">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:27.932426" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:27.931718" elapsed="0.000747"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.932960" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:27.932637" elapsed="0.000371"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:27.933059" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:21:27.933244" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:27.931318" elapsed="0.001951"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:27.937876" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:27.937681" elapsed="0.000221"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:27.938305" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.938067" elapsed="0.000341">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.938574" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.938779" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.938935" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.939111" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.939290" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.939450" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.939624" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.939784" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.949631" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.949827" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.959796" 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-07T17:21:27.960012" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.960340" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.937139" elapsed="0.023326">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:27.960580" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:27.960624" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:27.936554" elapsed="0.024093"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.960858" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:27.960738" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:27.960718" 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-07T17:21:27.962272" elapsed="0.000230"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.962990" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:27.962658" elapsed="0.000362"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:27.964015" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:27.963547" elapsed="0.000496"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:27.964092" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:21:27.964247" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:27.963206" elapsed="0.001065"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.964808" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:27.964430" elapsed="0.000405"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.965355" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:27.965005" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:27.965777" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:27.975985" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:27.965546" elapsed="0.012205">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.977937" 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-07T17:21:27.978125" 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-07T17:21:27.978289" 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-07T17:21:27.978473" 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-07T17:21:27.978644" 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-07T17:21:27.978804" 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-07T17:21:27.979091" 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-07T17:21:27.979261" 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-07T17:21:27.979419" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:27.978948" elapsed="0.000523"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.978874" 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-07T17:21:27.979637" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.979694" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.961704" elapsed="0.018159">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:27.979996" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:27.980042" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:27.961096" elapsed="0.018969"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.980695" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.980369" elapsed="0.000386">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:27.980153" elapsed="0.000665">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:27.980134" elapsed="0.000717">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.980897" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.936005" elapsed="0.045011">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.981191" 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-07T17:21:27.981353" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.981414" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:27.933574" elapsed="0.047939">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.981676" 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-07T17:21:27.981850" 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-07T17:21:27.982031" 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-07T17:21:27.982191" 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-07T17:21:27.982367" 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-07T17:21:27.982534" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.982595" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:27.930531" elapsed="0.052165">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<msg time="2026-04-07T17:21:27.982834" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.265016" elapsed="20.717945">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.983052" elapsed="0.000016"/>
</return>
<var>${original_owner}</var>
<var>${original_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:21:07.262939" elapsed="20.720217">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${original_candidate}</var>
<arg>${original_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.983329" 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-07T17:21:27.983508" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${original_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:27.983672" elapsed="0.000020"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:21:06.861955" elapsed="21.121884">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</test>
<test id="s1-s2-s2-t4" name="Create Bridge Manually and Verify Before Fail" line="35">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:27.987163" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:27.986886" elapsed="0.000540"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:27.988399" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:27.988290" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:27.988271" 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-07T17:21:27.993240" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:27.993131" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:27.993112" elapsed="0.000196"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.994311" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:27.993899" elapsed="0.000439"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:27.994798" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:27.994494" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:27.994867" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:27.995039" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:27.993528" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.000138" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.000028" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.000008" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.001439" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.001333" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.001314" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:28.002023" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.001645" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.002483" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:28.002206" elapsed="0.000303"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.032660" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:28.003064" elapsed="0.029778"/>
</kw>
<msg time="2026-04-07T17:21:28.033032" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:28.033080" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.002663" elapsed="0.030490"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.100507" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:28.033722" elapsed="0.067041"/>
</kw>
<msg time="2026-04-07T17:21:28.100996" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:28.101047" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.033326" elapsed="0.067760"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.101484" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.101195" elapsed="0.000370"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.101161" elapsed="0.000444"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.102224" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.101755" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.102617" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.102389" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.102370" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:28.102758" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.105260" elapsed="0.000534"/>
</kw>
<kw name="Open 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-07T17:21:28.106787" elapsed="0.000713"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:28.108445" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.103719" elapsed="0.005144"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:28.103087" elapsed="0.005907"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:28.001028" elapsed="0.108071"/>
</kw>
<msg time="2026-04-07T17:21:28.109192" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.109237" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.000349" elapsed="0.108925"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:28.109464" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.109354" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.109335" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.110025" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.110388" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.110461" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:27.999676" elapsed="0.110898"/>
</kw>
<msg time="2026-04-07T17:21:28.110678" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.110723" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:27.995420" elapsed="0.115341"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.111105" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.110836" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.110819" elapsed="0.000417"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:27.995284" elapsed="0.115976"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.116649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.116538" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.116518" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.117938" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.117829" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.117811" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:28.118613" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.118242" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.119158" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:28.118795" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.149794" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:28.119751" elapsed="0.030209"/>
</kw>
<msg time="2026-04-07T17:21:28.150191" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:28.150241" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.119364" elapsed="0.030914"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.207809" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:28.150846" elapsed="0.057231"/>
</kw>
<msg time="2026-04-07T17:21:28.208274" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:28.208322" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.150448" elapsed="0.057911"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.208733" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.208455" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.208427" elapsed="0.000415"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.209417" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.209003" elapsed="0.000511"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.209809" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.209588" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.209564" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:28.209944" elapsed="0.000048"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.212382" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:21:28.213843" elapsed="0.000520"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:28.215292" elapsed="0.000342"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.210892" elapsed="0.004819"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:28.210274" elapsed="0.005550"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:28.117523" elapsed="0.098403"/>
</kw>
<msg time="2026-04-07T17:21:28.216097" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.216142" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.116864" elapsed="0.099317"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:28.216372" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.216263" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.216243" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.216864" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.217481" elapsed="0.000029"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.217559" elapsed="0.000019"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:28.116186" elapsed="0.101497"/>
</kw>
<msg time="2026-04-07T17:21:28.217779" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.217823" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.111537" elapsed="0.106324"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.218237" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.217938" elapsed="0.000357"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.217920" elapsed="0.000404"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:28.111393" elapsed="0.106955"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.224098" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.223983" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.223948" elapsed="0.000219"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.225468" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.225360" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.225343" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:28.226064" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.225681" elapsed="0.000429"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.226558" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:28.226282" elapsed="0.000308"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.256476" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:28.227268" elapsed="0.029385"/>
</kw>
<msg time="2026-04-07T17:21:28.256832" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:28.256879" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.226780" elapsed="0.030135"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.315426" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:28.257503" elapsed="0.058134"/>
</kw>
<msg time="2026-04-07T17:21:28.315805" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:28.315851" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.257106" elapsed="0.058781"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.316222" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.315991" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.315947" elapsed="0.000376"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.316908" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.316528" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.317304" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.317091" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.317072" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:28.317436" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.319822" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.321285" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:28.322708" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.318345" elapsed="0.004781"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:28.317723" elapsed="0.005519"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:28.225045" elapsed="0.098299"/>
</kw>
<msg time="2026-04-07T17:21:28.323437" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.323481" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.224318" elapsed="0.099200"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:28.323701" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.323596" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.323577" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.324190" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.324518" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.324589" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:28.223555" elapsed="0.101140"/>
</kw>
<msg time="2026-04-07T17:21:28.324789" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:28.324833" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:28.218628" elapsed="0.106243"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.325253" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.324947" elapsed="0.000360"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.324930" elapsed="0.000400"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:28.218480" elapsed="0.106875"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:27.995115" elapsed="0.330273"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:27.992753" elapsed="0.332698"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:27.988003" elapsed="0.337508"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:27.987567" elapsed="0.337994"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:27.984795" elapsed="0.340824"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:21:28.333912" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.333653" elapsed="0.000459"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.333635" elapsed="0.000505"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.334435" 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-07T17:21:28.334538" 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-07T17:21:28.334290" elapsed="0.000274"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.335118" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:21:28.334711" elapsed="0.000454"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.335681" level="INFO">${conn_id} = 633</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-07T17:21:28.335315" elapsed="0.000392"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.336607" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:28.336682" 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-07T17:21:28.336322" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.336857" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.338045" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:28.661000" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:06 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:28.337697" elapsed="0.323463"/>
</kw>
<msg time="2026-04-07T17:21:28.661247" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.337349" elapsed="0.323983"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:28.335918" elapsed="0.325530"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:28.662020" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:21:28.714205" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:28.714374" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:28.714439" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:28.661724" elapsed="0.052749"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:28.714714" elapsed="0.000694"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.716151" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.715698" elapsed="0.000514"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.716543" elapsed="0.000025"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:28.716336" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.716298" elapsed="0.000355"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:28.716883" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.716731" elapsed="0.000256"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.716709" elapsed="0.000317"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.717076" elapsed="0.000021"/>
</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-07T17:21:28.720998" elapsed="0.000466"/>
</kw>
<kw name="Open 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-07T17:21:28.721729" elapsed="0.000261"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:28.722207" elapsed="0.000142"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.717547" elapsed="0.004878"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:28.333127" elapsed="0.389429"/>
</kw>
<msg time="2026-04-07T17:21:28.722717" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.332555" elapsed="0.390233"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:28.332062" elapsed="0.390841"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.723656" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.723186" elapsed="0.000509"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.724402" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.723950" elapsed="0.000490"/>
</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-07T17:21:28.737342" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:28.736949" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.737838" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:28.737524" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:28.737906" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:28.738075" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:28.736582" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.743345" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.743048" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.743415" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:28.743558" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.742696" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.749874" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.749624" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.750326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.750084" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:28.765473" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:28.765684" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:28.765845" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.752330" elapsed="0.013552"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.750437" elapsed="0.015505"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.766221" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.766009" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.750417" elapsed="0.015925"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.770831" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.767748" elapsed="0.003147"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.767446" elapsed="0.003496"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.767420" elapsed="0.003577"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.774364" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.771375" elapsed="0.003051"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.771076" elapsed="0.003396"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.771053" elapsed="0.003443"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.775048" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.774651" elapsed="0.000423"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.775415" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.775183" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.775953" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.775652" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.775496" elapsed="0.000535"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.775164" elapsed="0.000889"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.776576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.776209" elapsed="0.000393"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.776897" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.776671" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.777445" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.777151" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.776995" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.776653" elapsed="0.000874"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.777683" elapsed="0.000354"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:28.778492" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.778199" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.778668" elapsed="0.002098"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:28.766834" elapsed="0.013993"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:28.781018" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.780897" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.780879" elapsed="0.000224"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.781246" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.781315" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:28.783431" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.743910" elapsed="0.039548"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:28.783513" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:28.783660" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:28.742216" elapsed="0.041469"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.784833" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:28.784460" elapsed="0.000440"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:28.784310" elapsed="0.000629"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:28.784180" elapsed="0.000804"/>
</for>
<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="PASS" start="2026-04-07T17:21:28.783904" elapsed="0.001137"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:28.738303" elapsed="0.046771"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.790390" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.790093" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.790461" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:28.790608" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.789736" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.796833" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.796578" elapsed="0.000301"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.797427" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.797126" elapsed="0.000347"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:28.809660" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:28.809813" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:28.809943" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.799464" elapsed="0.010544"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.797565" elapsed="0.012505"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.810317" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.810107" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.797523" elapsed="0.012916"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.815032" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.811876" elapsed="0.003220"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.811575" elapsed="0.003570"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.811543" elapsed="0.003636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.818535" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.815557" elapsed="0.003023"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.815255" elapsed="0.003360"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.815232" elapsed="0.003408"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.819207" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.818803" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.819534" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.819303" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.820091" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.819771" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.819616" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.819285" elapsed="0.000891"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.820690" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.820328" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.821051" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.820785" elapsed="0.000325"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.821602" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.821288" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.821134" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.820768" elapsed="0.000918"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.821831" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:28.822628" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.822348" elapsed="0.000306"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.822803" elapsed="0.002312"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:28.810936" elapsed="0.014244"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:28.825354" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.825249" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.825231" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.825598" elapsed="0.000058"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.825710" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:28.827884" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.790945" elapsed="0.036966"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:28.827963" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:28.828129" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:28.789240" elapsed="0.038915"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.829318" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:28.828920" elapsed="0.000465"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:28.828772" elapsed="0.000653"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:28.828641" elapsed="0.000814"/>
</for>
<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="PASS" start="2026-04-07T17:21:28.828378" elapsed="0.001150"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:28.785160" elapsed="0.044405"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.834801" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.834505" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.834873" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:28.835034" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.834166" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.841255" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.841008" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.841709" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.841446" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:28.855677" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:28.855778" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:28.855869" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.843736" elapsed="0.012158"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.841819" elapsed="0.014118"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.856133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.855963" elapsed="0.000235"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.841801" elapsed="0.014418"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.863384" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.857529" elapsed="0.005921"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.857207" elapsed="0.006291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.857182" elapsed="0.006351"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.866830" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.863912" elapsed="0.002964"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.863610" elapsed="0.003302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.863587" elapsed="0.003350"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.867479" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.867108" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.867805" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.867576" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.868405" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.868102" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.867889" elapsed="0.000581"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.867558" elapsed="0.000938"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.869027" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.868649" elapsed="0.000405"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.869354" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.869124" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.869896" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.869601" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.869437" elapsed="0.000521"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.869106" elapsed="0.000890"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.870142" elapsed="0.000345"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:28.870919" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.870647" elapsed="0.000299"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.871112" elapsed="0.002162"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:28.856603" elapsed="0.016734"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:28.873522" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.873406" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.873388" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.873749" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.873821" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:28.875999" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.835377" elapsed="0.040651"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:28.876080" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:28.876228" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:28.833669" elapsed="0.042585"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.877393" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:28.877022" elapsed="0.000435"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:28.876862" elapsed="0.000659"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:28.876733" elapsed="0.000818"/>
</for>
<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="PASS" start="2026-04-07T17:21:28.876471" elapsed="0.001133"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:28.829654" elapsed="0.047984"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:28.738158" elapsed="0.139507"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:21:28.736015" elapsed="0.141700"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:21:28.724702" elapsed="0.153065"/>
</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-07T17:21:28.887287" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:28.886892" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.887765" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:28.887466" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:28.887873" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:28.888045" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:28.886531" elapsed="0.001538"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.893305" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.893008" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.893378" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:28.893533" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.892659" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.899878" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.899628" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.900332" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.900088" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:28.909028" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:28.910896" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:28.911067" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.902382" elapsed="0.008722"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.900444" elapsed="0.010720"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.911407" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.911200" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.900425" elapsed="0.011100"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.916120" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.912894" elapsed="0.003358"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.912597" elapsed="0.003706"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.912572" elapsed="0.003765"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.919343" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.916719" elapsed="0.002669"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.916414" elapsed="0.003009"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.916391" elapsed="0.003056"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.919985" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.919602" elapsed="0.000410"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.920315" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.920083" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.920853" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.920555" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.920397" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.920065" elapsed="0.000871"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.921483" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.921104" elapsed="0.000406"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.921806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.921580" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.922349" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.922054" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.921887" elapsed="0.000523"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.921561" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.922574" elapsed="0.000340"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:28.923361" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.923090" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.923534" elapsed="0.002118"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:28.912015" elapsed="0.013699"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:28.925886" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.925782" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.925764" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.926128" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.926197" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:28.928390" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.893875" elapsed="0.034543"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:28.928470" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:28.928620" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:28.892177" elapsed="0.036468"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.929810" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:28.929435" elapsed="0.000451"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:28.929271" elapsed="0.000655"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:28.929141" elapsed="0.000814"/>
</for>
<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="PASS" start="2026-04-07T17:21:28.928865" elapsed="0.001159"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:28.888248" elapsed="0.041850"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.935422" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.935126" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.935494" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:28.935640" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.934772" elapsed="0.000892"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.941832" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.941575" elapsed="0.000302"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.942284" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.942040" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:28.956323" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:28.959723" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:28.960058" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.944286" elapsed="0.015837"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.942397" elapsed="0.017841"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.960735" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.960309" elapsed="0.000574"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.942378" elapsed="0.018553"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.967569" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.963445" elapsed="0.004257"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.962905" elapsed="0.004833"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.962861" elapsed="0.004902"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.970371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.968053" elapsed="0.002365"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.967818" elapsed="0.002635"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.967802" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.971090" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.970663" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.971422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.971188" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.971963" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.971660" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.971503" elapsed="0.000537"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.971170" elapsed="0.000893"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.972578" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.972217" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.972899" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:28.972673" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.973451" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.973149" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.972995" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.972655" elapsed="0.000879"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:28.973686" elapsed="0.000361"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:28.974512" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:28.974207" elapsed="0.000331"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:28.974687" elapsed="0.002347"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:28.961844" elapsed="0.015257"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:28.977282" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-07T17:21:28.977171" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.977153" elapsed="0.000249"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:28.977549" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:28.977619" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:28.979834" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.936002" elapsed="0.043861"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:28.979915" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:28.980084" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:28.934284" elapsed="0.045826"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.981349" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:28.980946" elapsed="0.000492"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:28.980794" elapsed="0.000684"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:28.980641" elapsed="0.000870"/>
</for>
<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="PASS" start="2026-04-07T17:21:28.980346" elapsed="0.001219"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:28.930190" elapsed="0.051477"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.986916" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:28.986591" elapsed="0.000352"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:28.987007" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:28.987161" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:28.986251" elapsed="0.000935"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.993311" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.993062" elapsed="0.000303"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:28.993756" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:28.993514" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:29.007035" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:29.007229" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:29.007337" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:28.995759" elapsed="0.011603"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:28.993866" elapsed="0.013538"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.007756" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.007430" elapsed="0.000465"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:28.993847" elapsed="0.014096"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.015813" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.010254" elapsed="0.005801"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.009740" elapsed="0.006397"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.009699" elapsed="0.006496"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.020518" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.016803" elapsed="0.003785"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.016319" elapsed="0.004321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.016282" elapsed="0.004394"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.021378" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.020878" elapsed="0.000535"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.021807" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.021504" elapsed="0.000376"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.022526" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.022136" elapsed="0.000430"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.021912" elapsed="0.000708"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.021480" elapsed="0.001167"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.023321" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.022843" elapsed="0.000512"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.023746" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.023450" elapsed="0.000369"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.024454" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.024077" elapsed="0.000414"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.023851" elapsed="0.000684"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.023426" elapsed="0.001137"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.024753" elapsed="0.000463"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:29.025803" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.025447" elapsed="0.000389"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.026051" elapsed="0.002910"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:29.008747" elapsed="0.020322"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:29.029319" elapsed="0.000071"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.029169" elapsed="0.000275"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.029143" elapsed="0.000337"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.029684" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.029784" elapsed="0.000023"/>
</return>
<msg time="2026-04-07T17:21:29.032842" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:28.987512" elapsed="0.045370"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:29.032952" elapsed="0.000057"/>
</return>
<msg time="2026-04-07T17:21:29.033181" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:28.985745" elapsed="0.047474"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.034828" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:29.034313" elapsed="0.000631"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:29.034101" elapsed="0.000917"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:29.033897" elapsed="0.001166"/>
</for>
<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="PASS" start="2026-04-07T17:21:29.033541" elapsed="0.001598"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:28.981766" elapsed="0.053470"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:28.888119" elapsed="0.147164"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:21:28.885964" elapsed="0.149402"/>
</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_operational}</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-07T17:21:28.877956" elapsed="0.157494"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:21:28.330027" elapsed="0.705525"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:21:27.984238" elapsed="1.051485"/>
</test>
<test id="s1-s2-s2-t5" name="Add Port Manually and Verify Before Fail" line="39">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:29.039517" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:29.039256" elapsed="0.000522"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.040769" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.040660" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.040642" 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-07T17:21:29.045585" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.045478" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.045460" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.046642" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:29.046263" elapsed="0.000406"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.047180" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:29.046823" elapsed="0.000383"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:29.047250" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:29.047403" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.045873" elapsed="0.001555"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.052477" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.052367" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.052349" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.053807" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.053700" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.053682" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:29.054397" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.054037" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.054841" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:29.054576" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.082703" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:29.055418" elapsed="0.027460"/>
</kw>
<msg time="2026-04-07T17:21:29.083069" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:29.083116" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.055037" elapsed="0.028117"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.137076" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:29.083708" elapsed="0.053579"/>
</kw>
<msg time="2026-04-07T17:21:29.137455" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:29.137543" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.083320" elapsed="0.054262"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.137880" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.137661" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.137641" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.138520" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.138145" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.138885" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.138675" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.138656" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:29.139036" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.141375" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:21:29.142849" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:29.144306" elapsed="0.000475"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.139872" elapsed="0.004980"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:29.139296" elapsed="0.005685"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:29.053397" elapsed="0.091687"/>
</kw>
<msg time="2026-04-07T17:21:29.145176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.145218" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.052691" elapsed="0.092588"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:29.145470" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.145358" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.145339" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.145941" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.146286" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.146356" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:29.052031" elapsed="0.094431"/>
</kw>
<msg time="2026-04-07T17:21:29.146554" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.146597" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.047778" elapsed="0.098856"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.146953" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.146707" elapsed="0.000331"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.146690" elapsed="0.000372"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:29.047641" elapsed="0.099444"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.152274" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.152167" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.152149" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.153528" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.153422" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.153404" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:29.154152" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.153774" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.154586" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:29.154332" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.186230" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:29.155198" elapsed="0.031223"/>
</kw>
<msg time="2026-04-07T17:21:29.186612" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:29.186659" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.154767" elapsed="0.031929"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.243829" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:29.187333" elapsed="0.056817"/>
</kw>
<msg time="2026-04-07T17:21:29.244381" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:29.244428" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.186888" elapsed="0.057577"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.244932" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.244588" elapsed="0.000445"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.244550" elapsed="0.000514"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.245709" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.245227" elapsed="0.000567"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.246092" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.245862" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.245843" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:29.246231" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.248768" elapsed="0.000552"/>
</kw>
<kw name="Open 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-07T17:21:29.250273" elapsed="0.000499"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:29.251700" elapsed="0.000348"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.247236" elapsed="0.004886"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:29.246575" elapsed="0.005664"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:29.153112" elapsed="0.099228"/>
</kw>
<msg time="2026-04-07T17:21:29.252437" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.252481" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.152486" elapsed="0.100030"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:29.252702" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.252594" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.252575" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.253276" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.253982" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.254060" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:29.151820" elapsed="0.102352"/>
</kw>
<msg time="2026-04-07T17:21:29.254267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.254310" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.147340" elapsed="0.107005"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.254677" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.254421" elapsed="0.000308"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.254403" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:29.147205" elapsed="0.107573"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.260075" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.259953" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.259935" elapsed="0.000206"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.261481" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.261370" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.261352" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:29.262062" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.261684" elapsed="0.000405"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.262497" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:29.262240" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.291289" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:29.263062" elapsed="0.028435"/>
</kw>
<msg time="2026-04-07T17:21:29.291694" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:29.291742" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.262673" elapsed="0.029104"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.346271" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:29.292498" elapsed="0.054118"/>
</kw>
<msg time="2026-04-07T17:21:29.346871" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:29.346917" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.292052" elapsed="0.054903"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.347473" elapsed="0.000027"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.347111" elapsed="0.000446"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.347069" elapsed="0.000518"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.348264" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.347733" elapsed="0.000621"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.348633" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.348421" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.348402" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:29.348771" elapsed="0.000044"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.351452" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.352944" elapsed="0.000537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:29.354419" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.349902" elapsed="0.004930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:29.349244" elapsed="0.005703"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:29.260894" elapsed="0.094173"/>
</kw>
<msg time="2026-04-07T17:21:29.355166" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.355212" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.260286" elapsed="0.094964"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:29.355436" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.355329" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.355309" elapsed="0.000216"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.355939" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.356311" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.356382" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:29.259597" elapsed="0.096896"/>
</kw>
<msg time="2026-04-07T17:21:29.356591" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:29.356636" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.255074" elapsed="0.101599"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.357013" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.356751" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.356734" elapsed="0.000368"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:29.254918" elapsed="0.102209"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:29.047478" elapsed="0.309687"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:29.045102" elapsed="0.312129"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:29.040372" elapsed="0.316921"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:29.039928" elapsed="0.317415"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:29.037041" elapsed="0.320361"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:21:29.365790" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.365527" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.365508" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.366181" 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-07T17:21:29.366284" 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-07T17:21:29.366034" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.366834" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:21:29.366457" elapsed="0.000459"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.367460" level="INFO">${conn_id} = 638</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-07T17:21:29.367086" elapsed="0.000400"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.368400" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:29.368475" 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-07T17:21:29.368104" elapsed="0.000396"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.368658" elapsed="0.000331"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.369831" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:29.704364" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:28 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:29.369516" elapsed="0.335063"/>
</kw>
<msg time="2026-04-07T17:21:29.704669" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.369164" elapsed="0.335608"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:29.367696" elapsed="0.337201"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:29.705499" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:21:29.778841" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:29.779120" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:29.779219" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:29.705203" elapsed="0.074070"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:29.779627" elapsed="0.000922"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.781639" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.781014" elapsed="0.000723"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.782230" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:29.781909" elapsed="0.000429"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.781858" elapsed="0.000530"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:29.782730" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.782504" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.782472" elapsed="0.000436"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.783010" elapsed="0.000033"/>
</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-07T17:21:29.788835" elapsed="0.000722"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.789779" elapsed="0.000252"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:29.790234" elapsed="0.000136"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.783709" elapsed="0.006732"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:29.364987" elapsed="0.425578"/>
</kw>
<msg time="2026-04-07T17:21:29.790641" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.364418" elapsed="0.426292"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:29.363794" elapsed="0.427111"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.791639" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.791188" elapsed="0.000488"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.792343" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.791918" elapsed="0.000461"/>
</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-07T17:21:29.805007" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:29.804594" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.805493" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:29.805192" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:29.805561" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:29.805718" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.804227" elapsed="0.001515"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.811027" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.810711" elapsed="0.000343"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:29.811098" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:29.811242" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.810372" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.817529" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.817279" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.817961" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.817721" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:29.826174" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:29.826326" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:29.826421" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:29.819981" elapsed="0.006466"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.818092" elapsed="0.008398"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.826670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.826520" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.818073" elapsed="0.008682"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.830016" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.827778" elapsed="0.002285"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.827559" elapsed="0.002537"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.827541" elapsed="0.002580"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.832484" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.830391" elapsed="0.002137"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.830176" elapsed="0.002385"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.830159" elapsed="0.002426"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.833196" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.832776" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.833541" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.833290" elapsed="0.000402"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.834425" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.833961" elapsed="0.000503"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.833732" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.833273" elapsed="0.001275"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.835325" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.834773" elapsed="0.000590"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.835798" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.835464" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.836590" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.836161" elapsed="0.000483"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.835915" elapsed="0.000783"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.835437" elapsed="0.001292"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.836942" elapsed="0.000522"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:29.838158" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.837699" elapsed="0.000497"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.838416" elapsed="0.003159"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:29.827135" elapsed="0.014532"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:29.841924" elapsed="0.000061"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.841770" elapsed="0.000268"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.841743" elapsed="0.000330"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.842284" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.842385" elapsed="0.000022"/>
</return>
<msg time="2026-04-07T17:21:29.845592" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:29.811604" elapsed="0.034016"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:29.845671" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:29.845819" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:29.809881" elapsed="0.035963"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.847054" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:29.846656" elapsed="0.000467"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:29.846501" elapsed="0.000664"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:29.846361" elapsed="0.000834"/>
</for>
<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="PASS" start="2026-04-07T17:21:29.846093" elapsed="0.001154"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:29.805952" elapsed="0.041328"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.852635" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.852326" elapsed="0.000336"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:29.852706" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:29.852850" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.851986" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.858962" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.858714" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.859410" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.859169" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:29.870205" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:29.870338" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:29.870436" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:29.861481" elapsed="0.008980"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.859521" elapsed="0.011000"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.870788" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.870562" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.859502" elapsed="0.011413"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.875815" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.872481" elapsed="0.003402"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.872158" elapsed="0.003774"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.872130" elapsed="0.003858"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.879552" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.876389" elapsed="0.003229"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.876072" elapsed="0.003597"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.876048" elapsed="0.003656"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.880557" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.879952" elapsed="0.000683"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.881101" elapsed="0.000034"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.880739" elapsed="0.000449"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.881764" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.881452" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.881223" elapsed="0.000602"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.880712" elapsed="0.001134"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.882371" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.882011" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.882694" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.882465" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.883233" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.882925" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.882775" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.882448" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.883463" elapsed="0.000344"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:29.884283" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.883965" elapsed="0.000343"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.884458" elapsed="0.004279"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:29.871492" elapsed="0.017312"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:29.889001" elapsed="0.000038"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.888876" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.888857" elapsed="0.000242"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.889243" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.889313" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:29.891442" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:29.853222" elapsed="0.038302"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:29.891583" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:29.891731" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:29.851490" elapsed="0.040266"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.893023" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:29.892618" elapsed="0.000473"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:29.892429" elapsed="0.000701"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:29.892287" elapsed="0.000874"/>
</for>
<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="PASS" start="2026-04-07T17:21:29.892008" elapsed="0.001206"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:29.847369" elapsed="0.045879"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.898402" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.898108" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:29.898472" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:29.898618" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.897756" elapsed="0.000886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.904736" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.904459" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.905186" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.904928" elapsed="0.000300"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:29.916674" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:29.916846" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:21:29.917026" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:29.907199" elapsed="0.009868"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.905296" elapsed="0.011838"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.917416" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.917174" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.905278" elapsed="0.012266"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.922821" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.919138" elapsed="0.003778"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.918785" elapsed="0.004207"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.918757" elapsed="0.004273"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.926303" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.923507" elapsed="0.002841"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.923147" elapsed="0.003236"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.923087" elapsed="0.003320"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.927006" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.926580" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.927337" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.927105" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.927873" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.927575" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.927417" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.927087" elapsed="0.000955"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.928921" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.928550" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.929272" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.929041" elapsed="0.000288"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.929802" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.929506" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.929353" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.929022" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.930049" elapsed="0.000349"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:29.930852" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.930559" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.931044" elapsed="0.002127"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:29.918123" elapsed="0.015113"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:29.933413" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.933306" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.933287" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.933649" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.933720" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:21:29.935851" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:29.898981" elapsed="0.036897"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:29.935928" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:29.936093" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:21:29.897271" elapsed="0.038847"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.937348" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:29.936950" elapsed="0.000465"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:29.936798" elapsed="0.000657"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:29.936653" elapsed="0.000832"/>
</for>
<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="PASS" start="2026-04-07T17:21:29.936355" elapsed="0.001182"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:29.893334" elapsed="0.044236"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:29.805801" elapsed="0.131798"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.803630" elapsed="0.134019"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:21:29.792625" elapsed="0.145079"/>
</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-07T17:21:29.947439" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:29.947055" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.947931" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:29.947624" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:29.948015" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:29.948171" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.946671" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.953539" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.953243" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:29.953611" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:29.953755" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.952888" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.960135" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.959869" elapsed="0.000311"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.960613" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.960332" elapsed="0.000325"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:29.969347" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:29.971801" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:29.971984" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:29.962637" elapsed="0.009387"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.960725" elapsed="0.011362"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.972346" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.972126" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.960707" elapsed="0.011766"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.977457" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.973986" elapsed="0.003617"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.973642" elapsed="0.004014"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.973616" elapsed="0.004077"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.981258" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:29.978116" elapsed="0.003208"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.977774" elapsed="0.003600"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.977749" elapsed="0.003662"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.982000" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.981606" elapsed="0.000421"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.982330" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.982099" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.982857" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.982563" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.982410" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.982080" elapsed="0.000859"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.983467" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.983107" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.983790" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:29.983562" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.984329" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.984039" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:29.983870" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.983544" elapsed="0.000866"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:29.984568" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:29.985363" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:29.985085" elapsed="0.000303"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:29.985536" elapsed="0.002128"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:29.973023" elapsed="0.014702"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:29.987896" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:29.987793" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:29.987775" elapsed="0.000220"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:29.988141" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:29.988210" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:29.990452" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:29.954125" elapsed="0.036355"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:29.990530" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:29.990677" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:29.952395" elapsed="0.038307"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.991850" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:29.991477" elapsed="0.000451"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:29.991330" elapsed="0.000651"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:29.991199" elapsed="0.000815"/>
</for>
<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="PASS" start="2026-04-07T17:21:29.990921" elapsed="0.001146"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:29.948439" elapsed="0.043703"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:29.997514" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:29.997215" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:29.997587" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:29.997734" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:29.996856" elapsed="0.000902"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.003849" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.003604" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.004297" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.004057" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:30.019341" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:30.020216" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:30.020488" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:30.006341" elapsed="0.014205"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.004407" elapsed="0.016232"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.021055" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.020697" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.004388" elapsed="0.016857"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.028807" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.023458" elapsed="0.005592"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.022951" elapsed="0.006178"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.022912" elapsed="0.006272"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.031771" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.029664" elapsed="0.002152"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.029307" elapsed="0.002543"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.029270" elapsed="0.002604"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.032411" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.032041" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.032748" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.032518" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.033296" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.032996" elapsed="0.000326"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.032828" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.032499" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.034215" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.033531" elapsed="0.000711"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.034540" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.034312" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.035109" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.034773" elapsed="0.000362"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.034621" elapsed="0.000549"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.034294" elapsed="0.000898"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.035335" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:30.036126" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.035834" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.036300" elapsed="0.002268"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:30.022030" elapsed="0.016600"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:30.038802" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.038699" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.038680" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.039046" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.039117" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:30.041554" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:29.998094" elapsed="0.043488"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:30.041634" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:30.041782" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:29.996356" elapsed="0.045452"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.042951" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:30.042582" elapsed="0.000464"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:30.042436" elapsed="0.000650"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:30.042305" elapsed="0.000811"/>
</for>
<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="PASS" start="2026-04-07T17:21:30.042046" elapsed="0.001121"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:29.992235" elapsed="0.051003"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.048389" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.048093" elapsed="0.000322"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:30.048484" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:30.048632" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.047743" elapsed="0.000914"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.054742" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.054498" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.055190" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.054935" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:30.065909" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:30.066125" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:30.066236" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:30.057195" elapsed="0.009066"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.055301" elapsed="0.011003"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.066477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.066329" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.055282" elapsed="0.011279"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.070715" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"509c50a9-efaa-49c5-940f-03cd82a97fd3","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"c0ebe733-5270-4d32-8777-3794499d2edb","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"02e95ee1-d7e0-4db4-9bff-1749813eaaec","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"aa:50:9c:50:c5:49","ovsdb:ofport":65534,"ovsdb:ifindex":16},{"tp-id":"vx1","ovsdb:port-uuid":"79c9c27a-7db8-4073-b39c-314548248dc1","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"15e2b2da-6fb1-4870-a6c5-928819ad4f95","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:aa:50:9c:50:c5:49"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.067559" elapsed="0.003363"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.067338" elapsed="0.003694"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.067320" elapsed="0.003770"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.076483" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.071696" elapsed="0.004887"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.071216" elapsed="0.005442"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.071178" elapsed="0.005533"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.077894" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.077083" elapsed="0.000869"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.078644" elapsed="0.000047"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.078138" elapsed="0.000632"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.079838" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.079189" elapsed="0.000705"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.078822" elapsed="0.001178"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.078098" elapsed="0.001953"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.081257" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.080391" elapsed="0.000925"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.081746" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.081467" elapsed="0.000335"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.082284" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.081993" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.081826" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.081428" elapsed="0.000937"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.082507" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:30.083291" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.083021" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.083463" elapsed="0.002124"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:30.066903" elapsed="0.018745"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:30.085820" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.085716" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.085698" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.086060" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.086131" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:30.088344" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:30.048989" elapsed="0.039383"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:30.088435" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:30.088584" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:21:30.047263" elapsed="0.041347"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.089752" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:30.089381" elapsed="0.000446"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:21:30.089235" elapsed="0.000631"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:30.089103" elapsed="0.000793"/>
</for>
<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="PASS" start="2026-04-07T17:21:30.088828" elapsed="0.001120"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:30.043330" elapsed="0.046704"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:29.948303" elapsed="0.141762"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.946095" elapsed="0.144022"/>
</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_operational}</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-07T17:21:29.937900" elapsed="0.152268"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:21:29.361765" elapsed="0.728468"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:21:29.036212" elapsed="1.054147"/>
</test>
<test id="s1-s2-s2-t6" name="Delete the Bridge Manually and Verify Before Fail" line="43">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:30.093633" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:30.093377" 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-07T17:21:30.094867" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.094759" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.094740" 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-07T17:21:30.099640" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.099534" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.099516" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.100706" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:30.100313" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.101212" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:30.100889" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:30.101282" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:30.101436" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:30.099922" elapsed="0.001539"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.106476" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.106369" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.106350" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.107764" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.107658" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.107641" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:30.108348" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.107994" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.108806" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:30.108539" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.135495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:30.109382" elapsed="0.026287"/>
</kw>
<msg time="2026-04-07T17:21:30.135839" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:30.135885" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.109003" elapsed="0.026918"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.195403" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:30.136534" elapsed="0.059074"/>
</kw>
<msg time="2026-04-07T17:21:30.195818" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:30.195863" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.136118" elapsed="0.059782"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.196222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.195999" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.195957" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.196870" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.196497" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.197259" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.197043" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.197024" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:30.197393" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.199693" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:21:30.201184" elapsed="0.000621"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:30.202741" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.198245" elapsed="0.004912"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:30.197656" elapsed="0.005616"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:30.107358" elapsed="0.096012"/>
</kw>
<msg time="2026-04-07T17:21:30.203461" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.203504" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.106693" elapsed="0.096847"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:30.203722" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.203616" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.203598" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.204213" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.204555" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.204626" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:30.106037" elapsed="0.098697"/>
</kw>
<msg time="2026-04-07T17:21:30.204824" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.204867" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.101812" elapsed="0.103091"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.205252" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.205006" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.204959" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:30.101676" elapsed="0.103674"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.210514" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.210408" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.210390" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.211793" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.211686" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.211668" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:30.212388" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.212016" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.212818" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:30.212567" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.244862" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:30.213475" elapsed="0.031662"/>
</kw>
<msg time="2026-04-07T17:21:30.245312" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:30.245359" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.213095" elapsed="0.032299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.314695" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:30.245955" elapsed="0.069065"/>
</kw>
<msg time="2026-04-07T17:21:30.315277" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:30.315346" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.245560" elapsed="0.069842"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.315853" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.315520" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.315490" elapsed="0.000533"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.316705" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.316265" elapsed="0.000530"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.317091" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.316861" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.316843" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:30.317239" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.320317" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:21:30.321745" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:30.323135" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.318393" elapsed="0.005148"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:30.317598" elapsed="0.006055"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:30.211348" elapsed="0.112411"/>
</kw>
<msg time="2026-04-07T17:21:30.323849" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.323893" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.210727" elapsed="0.113203"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:30.324145" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.324036" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.324017" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.324630" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.325219" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.325292" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:30.210075" elapsed="0.115329"/>
</kw>
<msg time="2026-04-07T17:21:30.325497" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.325539" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.205605" elapsed="0.119971"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.325894" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.325650" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.325633" elapsed="0.000353"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:30.205470" elapsed="0.120541"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.331181" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.331075" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.331057" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.332535" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.332429" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.332412" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:30.333110" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.332739" elapsed="0.000398"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.333543" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:30.333289" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.362615" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:30.334121" elapsed="0.028668"/>
</kw>
<msg time="2026-04-07T17:21:30.362957" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:30.363023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.333723" elapsed="0.029338"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.430048" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:30.363615" elapsed="0.066629"/>
</kw>
<msg time="2026-04-07T17:21:30.430410" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:30.430454" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.363228" elapsed="0.067263"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.430786" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.430569" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.430547" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.431412" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.431043" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.431773" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.431565" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.431547" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:30.431939" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.434255" elapsed="0.000551"/>
</kw>
<kw name="Open 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-07T17:21:30.435749" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:30.437158" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.432798" elapsed="0.004744"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:30.432219" elapsed="0.005436"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:30.332112" elapsed="0.105643"/>
</kw>
<msg time="2026-04-07T17:21:30.437846" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.437889" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.331395" elapsed="0.106531"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:30.438125" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.438017" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.437997" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.438588" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.438915" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.439002" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:30.330724" elapsed="0.108385"/>
</kw>
<msg time="2026-04-07T17:21:30.439201" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:30.439245" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.326268" elapsed="0.113013"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.439598" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.439355" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.439339" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:30.326133" elapsed="0.113565"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:30.101510" elapsed="0.338218"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:30.099171" elapsed="0.340614"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:30.094476" elapsed="0.345572"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:30.094055" elapsed="0.346042"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:30.091378" elapsed="0.348791"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:21:30.449919" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.449608" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.449585" elapsed="0.000449"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.450391" 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-07T17:21:30.450523" 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-07T17:21:30.450217" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.451344" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:21:30.450812" elapsed="0.000592"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.452049" level="INFO">${conn_id} = 643</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-07T17:21:30.451634" elapsed="0.000442"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.453056" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:21:30.453156" 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-07T17:21:30.452743" elapsed="0.000441"/>
</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-07T17:21:30.453350" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.454544" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:21:30.775187" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:21:02 UTC 2026

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


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:29 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:21:30.454224" elapsed="0.321046"/>
</kw>
<msg time="2026-04-07T17:21:30.775335" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.453850" elapsed="0.321546"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:21:30.452320" elapsed="0.323162"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:21:30.775869" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:21:30.869420" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:21:30.869657" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:21:30.869752" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:21:30.775658" elapsed="0.094143"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:30.870195" elapsed="0.000803"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.872008" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.871377" elapsed="0.000727"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.872520" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:30.872261" elapsed="0.000361"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.872217" elapsed="0.000454"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:21:30.873041" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.872786" elapsed="0.000386"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.872754" elapsed="0.000470"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.873297" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.878151" elapsed="0.000458"/>
</kw>
<kw name="Open 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-07T17:21:30.878844" elapsed="0.000236"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:30.879295" elapsed="0.000138"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.873943" elapsed="0.005564"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:21:30.448994" elapsed="0.430643"/>
</kw>
<msg time="2026-04-07T17:21:30.879713" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.448370" elapsed="0.431433"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:21:30.447677" elapsed="0.432316"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.880727" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.880263" elapsed="0.000503"/>
</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-07T17:21:30.889221" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:30.888823" elapsed="0.000425"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.889706" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:30.889404" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:30.889775" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:30.889926" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:30.888390" elapsed="0.001560"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.895243" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.894929" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:30.895314" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:30.895458" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.894586" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.901774" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.901527" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.902222" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.901965" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:30.909890" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:30.911006" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:30.911163" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:30.904233" elapsed="0.006967"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.902331" elapsed="0.008932"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.911524" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.911302" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.902313" elapsed="0.009337"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.916578" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.913184" elapsed="0.003716"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.912843" elapsed="0.004114"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.912817" elapsed="0.004204"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.920619" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.917434" elapsed="0.003230"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.917105" elapsed="0.003592"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.917080" elapsed="0.003641"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.921291" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.920876" elapsed="0.000441"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.921615" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.921386" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.922164" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.921850" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.921697" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.921368" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.922760" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.922397" elapsed="0.000389"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.923095" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.922854" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.923619" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.923329" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.923177" elapsed="0.000502"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.922836" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.923855" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:30.924661" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.924373" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.924835" elapsed="0.002115"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:30.912224" elapsed="0.014803"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:30.927201" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.927096" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.927079" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.927426" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.927496" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:30.929676" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:30.895833" elapsed="0.033871"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:30.929755" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:30.929903" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:21:30.894100" elapsed="0.035829"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.931099" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:30.930706" elapsed="0.000464"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:30.930558" elapsed="0.000652"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:30.930428" elapsed="0.000812"/>
</for>
<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="PASS" start="2026-04-07T17:21:30.930167" elapsed="0.001126"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:30.890169" elapsed="0.041191"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.938185" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.937873" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:30.938257" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:30.938403" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.937534" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.944529" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.944286" elapsed="0.000287"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.944958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.944720" elapsed="0.000297"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:30.956654" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:30.956808" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:30.956918" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:30.946953" elapsed="0.009991"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.945084" elapsed="0.011925"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.957184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.957035" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.945065" elapsed="0.012204"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.961681" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.958531" elapsed="0.003227"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.958234" elapsed="0.003572"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.958208" elapsed="0.003633"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.965182" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.962237" elapsed="0.003007"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.961917" elapsed="0.003375"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.961894" elapsed="0.003432"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.966075" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.965539" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.966531" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.966212" elapsed="0.000439"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.967348" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.966907" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.966688" elapsed="0.000747"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.966186" elapsed="0.001280"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.968234" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.967705" elapsed="0.000566"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.968662" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:30.968368" elapsed="0.000351"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.969206" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.968896" elapsed="0.000336"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.968743" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.968343" elapsed="0.000945"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:30.969431" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:30.970212" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:30.969927" elapsed="0.000311"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:30.970385" elapsed="0.002253"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:30.957625" elapsed="0.015075"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:30.972870" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:30.972768" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.972750" elapsed="0.000202"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:30.973109" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:30.973180" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:21:30.975341" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:30.938748" elapsed="0.036621"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:30.975420" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:30.975567" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:21:30.937043" elapsed="0.038550"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.976748" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:30.976375" elapsed="0.000441"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:30.976230" elapsed="0.000625"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:30.976099" elapsed="0.000786"/>
</for>
<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="PASS" start="2026-04-07T17:21:30.975822" elapsed="0.001115"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:30.931451" elapsed="0.045534"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.982147" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:30.981834" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:30.982218" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:30.982362" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:30.981499" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.988506" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.988260" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:30.988936" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:30.988698" elapsed="0.000334"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:30.999960" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:31.000134" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:21:31.000235" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:30.991013" elapsed="0.009248"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:30.989101" elapsed="0.011202"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.000477" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.000329" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:30.989082" elapsed="0.011480"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.003993" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.001562" elapsed="0.002489"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:31.001350" elapsed="0.002735"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.001331" elapsed="0.002780"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.007299" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.004383" elapsed="0.002980"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:31.004167" elapsed="0.003243"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.004150" elapsed="0.003295"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.008213" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:31.007672" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.008674" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.008350" elapsed="0.000404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.009435" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:31.009022" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:31.008787" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.008324" elapsed="0.001226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.010279" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:31.009761" elapsed="0.000555"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.010726" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.010412" elapsed="0.000391"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.011583" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:31.011170" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:31.010926" elapsed="0.000758"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.010387" elapsed="0.001328"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.011916" elapsed="0.000504"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:31.013037" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:31.012640" elapsed="0.000435"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.013283" elapsed="0.003106"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:31.000908" elapsed="0.015569"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:21:31.016681" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.016576" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.016549" elapsed="0.000216"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.016906" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.016998" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:21:31.019171" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:30.982704" elapsed="0.036495"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:31.019249" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:31.019397" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:21:30.981020" elapsed="0.038402"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.020585" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:21:31.020212" elapsed="0.000440"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:21:31.020065" elapsed="0.000627"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:21:31.019919" elapsed="0.000802"/>
</for>
<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="PASS" start="2026-04-07T17:21:31.019658" elapsed="0.001114"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:30.977075" elapsed="0.043731"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:30.890023" elapsed="0.130810"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:21:30.887513" elapsed="0.133367"/>
</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-07T17:21:30.881054" elapsed="0.139877"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:21:30.445332" elapsed="0.575678"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:21:30.090743" elapsed="0.930383"/>
</test>
<test id="s1-s2-s2-t7" name="Create Bridge In Owner and Verify Before Fail" line="47">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:31.024724" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:31.024470" 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-07T17:21:31.025950" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.025842" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.025824" 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-07T17:21:31.030721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.030615" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.030597" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.031824" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:31.031394" elapsed="0.000458"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.032330" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:31.032024" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:31.032401" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:31.032554" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:31.031022" elapsed="0.001557"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.037601" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.037494" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.037475" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.038857" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.038752" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.038735" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.039441" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.039086" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.039903" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.039644" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.069725" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.040479" elapsed="0.029419"/>
</kw>
<msg time="2026-04-07T17:21:31.070157" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.070204" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.040101" elapsed="0.030139"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.139414" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.070785" elapsed="0.068838"/>
</kw>
<msg time="2026-04-07T17:21:31.139789" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.139835" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.070405" elapsed="0.069465"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.140188" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.139947" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.139928" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.140794" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.140426" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.141173" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.140944" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.140927" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.141303" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.143589" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:21:31.145032" elapsed="0.000622"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.146614" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.142141" elapsed="0.004888"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.141552" elapsed="0.005592"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.038454" elapsed="0.108791"/>
</kw>
<msg time="2026-04-07T17:21:31.147336" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.147379" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.037812" elapsed="0.109605"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.147632" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.147495" elapsed="0.000197"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.147476" elapsed="0.000239"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.148116" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.148445" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.148516" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.037163" elapsed="0.111458"/>
</kw>
<msg time="2026-04-07T17:21:31.148713" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.148756" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.032930" elapsed="0.115862"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.149136" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.148865" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.148848" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:31.032794" elapsed="0.116443"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.154367" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.154260" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.154242" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.155625" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.155504" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.155486" elapsed="0.000205"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.156194" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.155827" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.156621" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.156371" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.194399" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.157226" elapsed="0.037368"/>
</kw>
<msg time="2026-04-07T17:21:31.194759" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.194805" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.156800" elapsed="0.038041"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.257248" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.195431" elapsed="0.062011"/>
</kw>
<msg time="2026-04-07T17:21:31.257653" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.257700" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.195044" elapsed="0.062693"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.258063" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.257816" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.257795" elapsed="0.000371"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.258681" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.258306" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.259068" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.258835" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.258817" elapsed="0.000353"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.259203" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.261498" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:21:31.262909" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.264291" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.260074" elapsed="0.004611"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.259473" elapsed="0.005324"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.155205" elapsed="0.109691"/>
</kw>
<msg time="2026-04-07T17:21:31.265017" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.265064" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.154581" elapsed="0.110520"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.265285" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.265179" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.265160" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.265746" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.266277" elapsed="0.000027"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.266352" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.153913" elapsed="0.112548"/>
</kw>
<msg time="2026-04-07T17:21:31.266557" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.266600" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.149491" elapsed="0.117145"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.266953" elapsed="0.000036"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.266710" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.266693" elapsed="0.000354"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:31.149357" elapsed="0.117714"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.272209" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.272101" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.272081" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.273604" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.273462" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.273444" elapsed="0.000231"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.274188" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.273815" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.274620" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.274367" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.309028" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.275199" elapsed="0.034019"/>
</kw>
<msg time="2026-04-07T17:21:31.309384" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.309431" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.274801" elapsed="0.034666"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.372515" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.310038" elapsed="0.062664"/>
</kw>
<msg time="2026-04-07T17:21:31.372870" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.372915" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.309632" elapsed="0.063319"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.373268" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.373052" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.373031" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.373907" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.373506" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.374287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.374078" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.374059" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.374417" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.376682" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:21:31.378150" elapsed="0.000455"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.379510" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.375246" elapsed="0.004648"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.374664" elapsed="0.005358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.273159" elapsed="0.106963"/>
</kw>
<msg time="2026-04-07T17:21:31.380216" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.380260" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.272422" elapsed="0.107874"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.380477" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.380372" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.380353" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.380934" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.381311" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.381383" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.271745" elapsed="0.109744"/>
</kw>
<msg time="2026-04-07T17:21:31.381599" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.381653" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.267325" elapsed="0.114372"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.382049" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.381775" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.381758" elapsed="0.000369"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:31.267191" elapsed="0.114959"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:31.032629" elapsed="0.349549"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:31.030251" elapsed="0.351981"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:31.025562" elapsed="0.356726"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.025147" elapsed="0.357184"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:31.022487" elapsed="0.359896"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:31.394265" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:31.390534" elapsed="0.003772">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:31.021646" elapsed="0.372810">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t8" name="Create Port In Owner and Verify Before Fail" line="51">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:31.397623" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:31.397368" 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-07T17:21:31.398854" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.398748" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.398730" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.403453" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.403347" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.403316" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.404492" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:31.404117" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.404988" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:31.404674" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:31.405059" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:31.405212" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:31.403737" elapsed="0.001498"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.410384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.410277" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.410259" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.411656" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.411550" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.411532" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.412233" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.411860" elapsed="0.000432"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.412703" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.412449" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.442095" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.413286" elapsed="0.028963"/>
</kw>
<msg time="2026-04-07T17:21:31.442417" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.442464" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.412884" elapsed="0.029616"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.499066" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.443074" elapsed="0.056182"/>
</kw>
<msg time="2026-04-07T17:21:31.499439" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.499485" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.442667" elapsed="0.056854"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.499819" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.499603" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.499584" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.500455" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.500089" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.500815" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.500606" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.500588" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.500946" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.503198" elapsed="0.000516"/>
</kw>
<kw name="Open 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-07T17:21:31.504616" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.505992" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.501774" elapsed="0.004602"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.501212" elapsed="0.005276"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.411218" elapsed="0.095372"/>
</kw>
<msg time="2026-04-07T17:21:31.506679" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.506721" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.410596" elapsed="0.096162"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.506937" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.506833" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.506814" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.507439" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.507765" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.507871" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.409931" elapsed="0.098082"/>
</kw>
<msg time="2026-04-07T17:21:31.508108" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.508151" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.405588" elapsed="0.102600"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.508504" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.508261" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.508244" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:31.405452" elapsed="0.103151"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.513740" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.513635" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.513617" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.515182" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.515077" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.515059" elapsed="0.000202"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.515754" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.515400" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.516201" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.515930" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.546238" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.516758" elapsed="0.029650"/>
</kw>
<msg time="2026-04-07T17:21:31.546572" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.546618" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.516382" elapsed="0.030272"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.603421" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.547236" elapsed="0.056378"/>
</kw>
<msg time="2026-04-07T17:21:31.603781" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.603827" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.546818" elapsed="0.057046"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.604184" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.603940" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.603920" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.604792" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.604424" elapsed="0.000454"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.605174" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.604944" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.604926" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.605304" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.607580" elapsed="0.000560"/>
</kw>
<kw name="Open 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-07T17:21:31.609077" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.610454" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.606131" elapsed="0.004714"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.605551" elapsed="0.005407"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.514763" elapsed="0.096310"/>
</kw>
<msg time="2026-04-07T17:21:31.611163" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.611220" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.513952" elapsed="0.097305"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.611436" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.611332" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.611314" elapsed="0.000202"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.611884" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.612219" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.612290" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.513303" elapsed="0.099092"/>
</kw>
<msg time="2026-04-07T17:21:31.612486" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.612529" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.508854" elapsed="0.103712"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.612885" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.612644" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.612627" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:31.508721" elapsed="0.104295"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.618386" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.618280" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.618262" elapsed="0.000190"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.619638" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.619533" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.619516" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.620215" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.619840" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.620645" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.620392" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.650384" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.621220" elapsed="0.029333"/>
</kw>
<msg time="2026-04-07T17:21:31.650720" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.650766" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.620824" elapsed="0.029977"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.708072" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.651400" elapsed="0.056893"/>
</kw>
<msg time="2026-04-07T17:21:31.708461" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.708506" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.650984" elapsed="0.057560"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.708837" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.708624" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.708605" elapsed="0.000330"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.709461" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.709094" elapsed="0.000453"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.709822" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.709612" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.709595" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.709951" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.712268" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:21:31.713695" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.715119" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.710784" elapsed="0.004725"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.710219" elapsed="0.005403"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.619236" elapsed="0.096485"/>
</kw>
<msg time="2026-04-07T17:21:31.715809" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.715852" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.618597" elapsed="0.097292"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.716084" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.715963" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.715945" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.716536" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.716857" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.716927" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.617930" elapsed="0.099120"/>
</kw>
<msg time="2026-04-07T17:21:31.717143" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.717186" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.613268" elapsed="0.103954"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.717537" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.717296" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.717279" elapsed="0.000334"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:31.613133" elapsed="0.104502"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:31.405286" elapsed="0.312377"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:31.402980" elapsed="0.314734"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:31.398466" elapsed="0.319335"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.398051" elapsed="0.319797"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:31.395402" elapsed="0.322498"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:31.729745" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:31.725914" elapsed="0.003869">Variable '${original_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:31.394769" elapsed="0.335149">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t9" name="Modify the destination IP of Port In Owner Before Fail" 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-07T17:21:31.733460" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:31.733207" elapsed="0.000515"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.734675" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.734569" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.734552" 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-07T17:21:31.739263" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.739160" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.739142" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.740298" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:31.739908" elapsed="0.000417"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.740777" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:31.740479" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:31.740845" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:31.741013" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:31.739542" elapsed="0.001496"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.746202" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.746096" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.746078" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.747466" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.747361" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.747343" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.748038" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.747671" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.748467" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.748217" elapsed="0.000276"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.776148" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.749040" elapsed="0.027262"/>
</kw>
<msg time="2026-04-07T17:21:31.776485" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.776532" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.748648" elapsed="0.027919"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.839893" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.777135" elapsed="0.062983"/>
</kw>
<msg time="2026-04-07T17:21:31.840322" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.840368" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.776730" elapsed="0.063674"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.840703" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.840483" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.840462" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.841325" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.840938" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.841692" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.841483" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.841465" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.841822" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.844085" elapsed="0.000498"/>
</kw>
<kw name="Open 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-07T17:21:31.845491" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.846855" elapsed="0.000343"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.842646" elapsed="0.004620"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.842085" elapsed="0.005294"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.747039" elapsed="0.100438"/>
</kw>
<msg time="2026-04-07T17:21:31.847567" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.847610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.746413" elapsed="0.101234"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.847827" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.847722" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.847704" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.848303" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.848623" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.848693" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.745749" elapsed="0.103050"/>
</kw>
<msg time="2026-04-07T17:21:31.848889" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.848932" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.741387" elapsed="0.107612"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.849321" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.849076" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.849059" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:31.741252" elapsed="0.108167"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.856036" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.855914" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.855896" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.857352" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.857245" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.857228" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.857906" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.857556" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.858375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.858124" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.893130" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.858930" elapsed="0.034361"/>
</kw>
<msg time="2026-04-07T17:21:31.893457" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:31.893503" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.858554" elapsed="0.034984"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.966879" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:31.894146" elapsed="0.072975"/>
</kw>
<msg time="2026-04-07T17:21:31.967290" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:31.967335" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.893702" elapsed="0.073669"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.967670" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.967448" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.967428" elapsed="0.000340"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:31.968302" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:31.967904" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.968663" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.968456" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.968438" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:31.968793" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:31.971089" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:21:31.972494" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:31.973848" elapsed="0.000330"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:31.969630" elapsed="0.004616"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:31.969066" elapsed="0.005295"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.856859" elapsed="0.117599"/>
</kw>
<msg time="2026-04-07T17:21:31.974546" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.974590" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.856251" elapsed="0.118375"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:31.974805" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:31.974700" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.974682" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.975291" elapsed="0.000058"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.975654" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.975725" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.855579" elapsed="0.120251"/>
</kw>
<msg time="2026-04-07T17:21:31.975922" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:31.975964" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.849669" elapsed="0.126366"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:31.976351" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:31.976110" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.976093" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:31.849535" elapsed="0.126915"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.981717" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.981612" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.981594" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:31.983006" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:31.982848" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:31.982831" elapsed="0.000242"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:31.983560" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:31.983210" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:31.984088" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:31.983736" elapsed="0.000380"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.012442" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:31.984645" elapsed="0.027995"/>
</kw>
<msg time="2026-04-07T17:21:32.012810" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:32.012855" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.984269" elapsed="0.028622"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.080545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:32.013454" elapsed="0.067283"/>
</kw>
<msg time="2026-04-07T17:21:32.080903" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:32.080948" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.013071" elapsed="0.067934"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.081299" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.081084" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.081063" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.081903" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.081537" elapsed="0.000473"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.082287" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.082078" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.082060" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:32.082452" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:32.084723" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:21:32.086152" elapsed="0.000456"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:32.087519" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:32.083305" elapsed="0.004600"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:32.082700" elapsed="0.005332"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:31.982548" elapsed="0.105585"/>
</kw>
<msg time="2026-04-07T17:21:32.088222" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.088266" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.981930" elapsed="0.106373"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:32.088484" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:32.088379" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.088360" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.088940" elapsed="0.000039"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.089280" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.089350" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:31.981279" elapsed="0.108176"/>
</kw>
<msg time="2026-04-07T17:21:32.089546" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.089589" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.976704" elapsed="0.112920"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.089936" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.089698" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.089681" elapsed="0.000363"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:31.976571" elapsed="0.113495"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:31.741088" elapsed="0.349007"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:31.738778" elapsed="0.351370"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:31.734291" elapsed="0.355912"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:31.733865" elapsed="0.356383"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:31.731262" elapsed="0.359038"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:32.098403" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.094664" elapsed="0.003777">Variable '${original_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:21:31.730688" elapsed="0.367895">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t10" name="Verify Port Is Modified Before Fail" 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-07T17:21:32.101649" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:32.101395" 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-07T17:21:32.102899" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.102762" elapsed="0.000230"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.102745" elapsed="0.000272"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.107507" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.107402" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.107385" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.108543" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:32.108170" elapsed="0.000399"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.109036" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:32.108721" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:32.109105" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:32.109257" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:32.107787" elapsed="0.001494"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.114411" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.114305" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.114286" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.115677" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.115573" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.115555" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:32.116254" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:32.115880" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.116683" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:32.116431" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.145930" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:32.117258" elapsed="0.028866"/>
</kw>
<msg time="2026-04-07T17:21:32.146291" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:32.146336" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.116862" elapsed="0.029510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.196256" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:32.146939" elapsed="0.049503"/>
</kw>
<msg time="2026-04-07T17:21:32.196608" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:32.196653" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.146537" elapsed="0.050152"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.197001" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.196766" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.196747" elapsed="0.000355"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.197601" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.197239" elapsed="0.000442"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.197955" elapsed="0.000037"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.197746" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.197728" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:32.198135" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:32.200429" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:21:32.201854" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:32.203274" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:32.198997" elapsed="0.004668"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:32.198384" elapsed="0.005393"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:32.115276" elapsed="0.088601"/>
</kw>
<msg time="2026-04-07T17:21:32.203981" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.204027" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.114629" elapsed="0.089435"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:32.204246" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:32.204141" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.204122" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.204701" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.205039" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.205110" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:32.113960" elapsed="0.091253"/>
</kw>
<msg time="2026-04-07T17:21:32.205304" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.205347" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.109631" elapsed="0.095751"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.205694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.205455" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.205438" elapsed="0.000332"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:32.109495" elapsed="0.096297"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.211203" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.211095" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.211076" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.212440" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.212335" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.212317" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:32.213022" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:32.212650" elapsed="0.000399"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.213452" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:32.213200" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.247268" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:32.214024" elapsed="0.033408"/>
</kw>
<msg time="2026-04-07T17:21:32.247599" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:32.247644" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.213632" elapsed="0.034048"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.315995" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:32.248247" elapsed="0.067970"/>
</kw>
<msg time="2026-04-07T17:21:32.316385" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:32.316431" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.247843" elapsed="0.068624"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.316759" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.316544" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.316525" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.317382" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.317012" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.317737" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.317528" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.317510" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:32.317866" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:32.320130" elapsed="0.000498"/>
</kw>
<kw name="Open 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-07T17:21:32.321530" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:32.322910" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:32.318706" elapsed="0.004611"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:32.318131" elapsed="0.005297"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:32.212038" elapsed="0.111490"/>
</kw>
<msg time="2026-04-07T17:21:32.323634" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.323685" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.211414" elapsed="0.112307"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:32.323901" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:32.323796" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.323778" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.324371" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.324692" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.324762" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:32.210744" elapsed="0.114123"/>
</kw>
<msg time="2026-04-07T17:21:32.324957" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.325017" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.206072" elapsed="0.118981"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.325368" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.325127" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.325111" elapsed="0.000333"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:32.205908" elapsed="0.119559"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.330924" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.330817" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.330799" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.332196" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.332091" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.332073" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:32.332752" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:32.332398" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.333198" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:32.332928" elapsed="0.000295"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.362904" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:32.333798" elapsed="0.029584"/>
</kw>
<msg time="2026-04-07T17:21:32.363761" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:32.363809" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.333378" elapsed="0.030469"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:32.424612" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:32.364672" elapsed="0.060268"/>
</kw>
<msg time="2026-04-07T17:21:32.425211" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:32.425261" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.364150" elapsed="0.061149"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.425781" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.425434" elapsed="0.000430"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.425389" elapsed="0.000505"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.426540" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.426056" elapsed="0.000600"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.426941" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.426725" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.426706" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:32.427095" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:32.429600" elapsed="0.000550"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:32.431139" elapsed="0.000506"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:32.432590" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:32.428071" elapsed="0.004946"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:32.427423" elapsed="0.005710"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:32.331776" elapsed="0.101460"/>
</kw>
<msg time="2026-04-07T17:21:32.433333" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.433378" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.331152" elapsed="0.102263"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:32.433671" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:32.433562" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.433542" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.434194" elapsed="0.000038"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.434619" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.434693" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:32.330436" elapsed="0.104380"/>
</kw>
<msg time="2026-04-07T17:21:32.434917" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:32.434962" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.325717" elapsed="0.109300"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.435344" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.435096" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:32.435079" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:32.325584" elapsed="0.109862"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:32.109331" elapsed="0.326150"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:32.107050" elapsed="0.328493"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:32.102478" elapsed="0.333128"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:32.102068" elapsed="0.333587"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:32.099442" elapsed="0.336273"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.442837" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:32.442443" elapsed="0.000421"/>
</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-07T17:21:32.452576" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:32.452193" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.453080" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:32.452759" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:32.453151" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:32.453304" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:32.451810" elapsed="0.001518"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.458627" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:32.458309" elapsed="0.000345"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:32.458699" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:32.458845" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:32.457952" elapsed="0.000917"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.465211" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.464939" elapsed="0.000317"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:32.465643" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:32.465404" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:32.474831" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:32.475041" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:32.475172" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.467825" elapsed="0.007754">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:32.465760" elapsed="0.009904">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.475849" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:32.475698" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:32.465740" elapsed="0.010198">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.476328" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.476461" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:32.476426" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:32.476408" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:32.476661" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.476729" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.459216" elapsed="0.017619">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:32.476895" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:21:32.457469" elapsed="0.019533">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:32.477233" elapsed="0.000023"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:32.453528" elapsed="0.023782">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:32.453384" elapsed="0.023982">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.451153" elapsed="0.026302">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:21:33.494597" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:33.494091" elapsed="0.000539"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:33.495130" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:33.494799" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:33.495284" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:33.495460" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:33.493667" elapsed="0.001818"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:33.500844" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:33.500543" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:33.500916" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:33.501079" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:33.500204" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:33.507613" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:33.507350" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:33.508069" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:33.507808" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:33.516323" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:33.516467" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:33.516577" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:33.510113" elapsed="0.006883">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:33.508187" elapsed="0.008895">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:33.517267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:33.517116" elapsed="0.000216"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:33.508167" elapsed="0.009188">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:33.517729" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:33.517880" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:33.517824" elapsed="0.000098"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:33.517807" elapsed="0.000138"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:33.518100" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:33.518170" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:33.501445" elapsed="0.016830">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:33.518335" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:21:33.499708" elapsed="0.018719">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:33.518708" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:33.495691" elapsed="0.023095">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:33.495543" elapsed="0.023304">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:33.492854" elapsed="0.026085">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:21:34.535271" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:34.534744" elapsed="0.000562"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:34.535802" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:34.535478" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:34.535878" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:21:34.536075" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:34.534342" elapsed="0.001758"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:34.541454" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:34.541120" elapsed="0.000361"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:34.541527" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:34.541676" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:34.540760" elapsed="0.000940"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:34.548236" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:34.547959" elapsed="0.000324"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:34.548686" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:34.548437" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:34.557594" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:34.557738" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:34.557845" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:34.551002" elapsed="0.007260">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:34.548803" elapsed="0.009543">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:34.558535" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:34.558381" elapsed="0.000394"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:34.548782" elapsed="0.010021">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:34.559200" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:34.559336" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:34.559299" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:34.559281" elapsed="0.000119"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:34.559543" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:34.559614" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:34.542063" elapsed="0.017719">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:34.559845" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:21:34.540272" elapsed="0.019667">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:34.560187" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:34.536310" elapsed="0.023955">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:34.536160" elapsed="0.024164">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:34.533486" elapsed="0.026931">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:21:35.575443" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:35.574946" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:35.575964" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:35.575648" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:35.576057" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:21:35.576235" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:35.574558" elapsed="0.001702"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:35.581543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:35.581245" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:35.581615" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:35.581758" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:35.580889" elapsed="0.000893"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:35.588171" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:35.587894" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:35.588611" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:35.588367" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:35.597149" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:35.597300" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:35.597407" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:35.590737" elapsed="0.007067">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:35.588733" elapsed="0.009155">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:35.598095" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:35.597924" elapsed="0.000239"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:35.588711" elapsed="0.009477">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:35.598565" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:35.598708" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:35.598668" elapsed="0.000082"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:35.598647" elapsed="0.000125"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:35.598913" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:35.598999" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:35.582135" elapsed="0.016969">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:35.599167" elapsed="0.000014"/>
</return>
<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="FAIL" start="2026-04-07T17:21:35.580391" elapsed="0.018870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:35.599492" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:35.576464" elapsed="0.023107">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:35.576318" elapsed="0.023312">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:35.573724" elapsed="0.025997">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:21:36.615689" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:36.615049" elapsed="0.000683"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:36.616268" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:36.615903" elapsed="0.000505"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:36.616464" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:21:36.616647" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:36.614407" elapsed="0.002265"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:36.621944" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:36.621644" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:36.622031" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:36.622177" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:36.621304" elapsed="0.000898"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:36.628780" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:36.628516" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:36.629250" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:36.629001" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:36.637881" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:36.638051" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:36.638162" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:36.631364" elapsed="0.007187">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:36.629369" elapsed="0.009268">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:36.638827" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:36.638672" elapsed="0.000222"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:36.629347" elapsed="0.009571">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:36.639307" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:36.639445" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:36.639407" elapsed="0.000081"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:36.639388" elapsed="0.000123"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:36.639657" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:36.639730" elapsed="0.000016"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:36.622540" elapsed="0.017297">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:36.639903" elapsed="0.000020"/>
</return>
<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="FAIL" start="2026-04-07T17:21:36.620808" elapsed="0.019245">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:36.640378" elapsed="0.000026"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:36.616877" elapsed="0.023584">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:36.616729" elapsed="0.023792">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:36.613323" elapsed="0.027292">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:21:37.656886" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:37.656440" elapsed="0.000476"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.657404" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:37.657094" elapsed="0.000336"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:37.657475" elapsed="0.000035"/>
</return>
<msg time="2026-04-07T17:21:37.657637" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:37.656056" elapsed="0.001606"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.663204" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:37.662890" elapsed="0.000341"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:37.663276" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:37.663420" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:37.662554" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.671265" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:37.671007" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.671708" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:37.671465" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:37.682640" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:37.682818" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:21:37.683023" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:21:37.673753" elapsed="0.009775">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:37.671845" elapsed="0.011796">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.683932" elapsed="0.000057"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.683688" elapsed="0.000428"/>
</branch>
<status status="FAIL" start="2026-04-07T17:21:37.671802" elapsed="0.012350">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.684656" elapsed="0.000037"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.684851" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.684798" elapsed="0.000112"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:37.684774" elapsed="0.000167"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.685156" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.685255" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:21:37.663769" elapsed="0.021633">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.685489" elapsed="0.000021"/>
</return>
<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="FAIL" start="2026-04-07T17:21:37.662074" elapsed="0.023546">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:21:37.685937" elapsed="0.000052"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:21:37.657861" elapsed="0.028213">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:21:37.657723" elapsed="0.028432">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:21:37.655277" elapsed="0.031005">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:21:37.686415" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:21:32.443066" elapsed="5.243477">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.440468" elapsed="5.246227">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:32.098922" elapsed="5.588007">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s2-t11" name="Delete Port In Owner Before Fail" line="63">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:37.691408" elapsed="0.000291"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:37.691049" elapsed="0.000726"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.693137" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.693024" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.693005" elapsed="0.000202"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.697826" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.697698" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.697676" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.699047" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:37.698601" elapsed="0.000474"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.699600" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:37.699253" elapsed="0.000375"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:37.699680" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:37.699878" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:37.698174" elapsed="0.001731"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.706552" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.706410" elapsed="0.000203"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.706386" elapsed="0.000258"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.708288" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.708148" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.708125" elapsed="0.000252"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:37.709059" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:37.708567" elapsed="0.000527"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.709642" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:37.709303" elapsed="0.000373"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.755521" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:37.710418" elapsed="0.045325"/>
</kw>
<msg time="2026-04-07T17:21:37.756030" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:37.756082" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.709884" elapsed="0.046236"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.801721" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:37.756745" elapsed="0.045170"/>
</kw>
<msg time="2026-04-07T17:21:37.802104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:37.802150" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.756313" elapsed="0.045873"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.802488" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.802265" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.802245" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.803123" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:37.802728" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.803483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.803274" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.803256" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:37.803613" elapsed="0.000037"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:37.805998" elapsed="0.000571"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:37.807495" elapsed="0.000514"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:37.808907" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:37.804520" elapsed="0.004799"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:37.803923" elapsed="0.005511"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:37.707715" elapsed="0.101820"/>
</kw>
<msg time="2026-04-07T17:21:37.809627" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:37.809672" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.706844" elapsed="0.102865"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:37.809892" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:37.809786" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.809768" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.810386" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.810721" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.810792" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:37.705952" elapsed="0.104946"/>
</kw>
<msg time="2026-04-07T17:21:37.811018" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:37.811064" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.700282" elapsed="0.110819"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.811422" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.811178" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.811161" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:37.700145" elapsed="0.111377"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.816957" elapsed="0.000057"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.816849" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.816831" elapsed="0.000238"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.818276" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.818169" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.818150" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:37.818841" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:37.818484" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.819342" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:37.819086" elapsed="0.000282"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.850329" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:37.819914" elapsed="0.031100"/>
</kw>
<msg time="2026-04-07T17:21:37.851560" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:37.851669" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.819523" elapsed="0.032259"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.901119" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:37.853609" elapsed="0.047857"/>
</kw>
<msg time="2026-04-07T17:21:37.901644" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:37.901691" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.852389" elapsed="0.049340"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.902157" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.901842" elapsed="0.000394"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.901807" elapsed="0.000462"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.902813" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:37.902416" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.903204" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.902983" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.902949" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:37.903345" elapsed="0.000051"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:37.906053" elapsed="0.000535"/>
</kw>
<kw name="Open 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-07T17:21:37.907615" elapsed="0.000537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:37.909090" elapsed="0.000331"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:37.904410" elapsed="0.005085"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:37.903737" elapsed="0.005873"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:37.817822" elapsed="0.091892"/>
</kw>
<msg time="2026-04-07T17:21:37.909812" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:37.909857" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.817218" elapsed="0.092677"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:37.910113" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:37.910003" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.909957" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.910624" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.911014" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.911089" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:37.816509" elapsed="0.094695"/>
</kw>
<msg time="2026-04-07T17:21:37.911305" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:37.911350" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.811808" elapsed="0.099582"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.911732" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.911470" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.911452" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:37.811648" elapsed="0.100192"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.917595" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.917488" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.917469" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:37.918889" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:37.918782" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.918765" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:37.919492" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:37.919127" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.919947" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:37.919672" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.949081" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:37.920528" elapsed="0.028852"/>
</kw>
<msg time="2026-04-07T17:21:37.949683" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:37.949768" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.920146" elapsed="0.029688"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:37.997471" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:37.950814" elapsed="0.046865"/>
</kw>
<msg time="2026-04-07T17:21:37.997849" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:37.997894" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.950167" elapsed="0.047763"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.998290" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.998048" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.998019" elapsed="0.000378"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:37.998920" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:37.998541" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:37.999311" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:37.999095" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:37.999076" elapsed="0.000337"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:37.999448" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.001930" elapsed="0.000542"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.003403" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.004834" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.000405" elapsed="0.004855"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:37.999777" elapsed="0.005598"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:37.918484" elapsed="0.086995"/>
</kw>
<msg time="2026-04-07T17:21:38.005579" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.005625" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.917848" elapsed="0.087814"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.005852" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.005744" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.005724" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.006419" elapsed="0.000091"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.006836" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.006908" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:37.917138" elapsed="0.089900"/>
</kw>
<msg time="2026-04-07T17:21:38.007139" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.007184" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.912218" elapsed="0.095005"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.007547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.007302" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.007284" elapsed="0.000340"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:37.912074" elapsed="0.095575"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:37.699960" elapsed="0.307736"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:37.697308" elapsed="0.310451"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:37.692635" elapsed="0.315186"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:37.692045" elapsed="0.315824"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:37.688277" elapsed="0.319649"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:38.019931" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:38.016233" elapsed="0.003749">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:37.687487" elapsed="0.332656">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t12" name="Delete Bridge In Owner And Verify Before Fail" line="67">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:38.023427" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:38.023169" 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-07T17:21:38.024696" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.024586" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.024568" 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-07T17:21:38.029319" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.029212" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.029195" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.030419" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:38.030034" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.030907" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:38.030603" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:38.030993" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:38.031148" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:38.029612" elapsed="0.001561"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.036426" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.036318" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.036299" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.037673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.037568" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.037550" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.038307" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.037920" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.038745" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.038487" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.067220" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.039323" elapsed="0.028057"/>
</kw>
<msg time="2026-04-07T17:21:38.067547" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.067593" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.038925" elapsed="0.028715"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.125662" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.068266" elapsed="0.057593"/>
</kw>
<msg time="2026-04-07T17:21:38.126048" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.126093" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.067806" elapsed="0.058324"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.126425" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.126207" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.126187" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.127046" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.126662" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.127411" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.127202" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.127184" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.127542" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.129840" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:21:38.131298" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.132715" elapsed="0.000349"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.128402" elapsed="0.004733"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.127812" elapsed="0.005437"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.037269" elapsed="0.096081"/>
</kw>
<msg time="2026-04-07T17:21:38.133440" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.133483" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.036639" elapsed="0.096881"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.133703" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.133596" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.133578" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.134186" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.134555" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.134627" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.035951" elapsed="0.098788"/>
</kw>
<msg time="2026-04-07T17:21:38.134830" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.134872" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.031536" elapsed="0.103372"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.135242" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.134997" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.134965" elapsed="0.000354"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:38.031400" elapsed="0.103942"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.140656" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.140547" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.140529" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.142007" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.141877" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.141859" elapsed="0.000218"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.142564" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.142215" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.143009" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.142743" elapsed="0.000293"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.176052" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.143568" elapsed="0.032654"/>
</kw>
<msg time="2026-04-07T17:21:38.176388" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.176434" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.143189" elapsed="0.033281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.239341" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.177038" elapsed="0.062514"/>
</kw>
<msg time="2026-04-07T17:21:38.239727" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.239773" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.176634" elapsed="0.063175"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.240135" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.239891" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.239869" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.240745" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.240375" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.241125" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.240897" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.240879" elapsed="0.000345"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.241256" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.243632" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:21:38.245088" elapsed="0.000464"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.246466" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.242155" elapsed="0.004701"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.241554" elapsed="0.005429"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.141577" elapsed="0.105510"/>
</kw>
<msg time="2026-04-07T17:21:38.247178" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.247221" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.140875" elapsed="0.106384"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.247442" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.247336" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.247316" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.247932" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.248281" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.248352" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.140211" elapsed="0.108247"/>
</kw>
<msg time="2026-04-07T17:21:38.248550" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.248593" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.135606" elapsed="0.113023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.248946" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.248703" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.248686" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:38.135460" elapsed="0.113618"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.254472" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.254365" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.254346" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.255751" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.255643" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.255625" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.256324" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.255956" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.256752" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.256501" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.284309" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.257323" elapsed="0.027219"/>
</kw>
<msg time="2026-04-07T17:21:38.284741" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.284788" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.256930" elapsed="0.027894"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.342307" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.285507" elapsed="0.057274"/>
</kw>
<msg time="2026-04-07T17:21:38.343060" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.343109" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.285072" elapsed="0.058074"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.343658" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.343274" elapsed="0.000471"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.343232" elapsed="0.000543"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.344416" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "B "e "f "o "r "e "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.343917" elapsed="0.000584"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.344782" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.344568" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.344550" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.344919" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.347453" elapsed="0.000575"/>
</kw>
<kw name="Open 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-07T17:21:38.348964" elapsed="0.000524"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.350419" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.345895" elapsed="0.004930"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.345259" elapsed="0.005683"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.255310" elapsed="0.095756"/>
</kw>
<msg time="2026-04-07T17:21:38.351166" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.351212" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.254684" elapsed="0.096564"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.351448" elapsed="0.000033"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.351333" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.351312" elapsed="0.000273"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.352046" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.352388" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.352461" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.254027" elapsed="0.098546"/>
</kw>
<msg time="2026-04-07T17:21:38.352670" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.352715" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.249335" elapsed="0.103418"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.353093" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.352831" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.352813" elapsed="0.000358"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:38.249200" elapsed="0.103995"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:38.031228" elapsed="0.322003"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:38.028844" elapsed="0.324449"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:38.024300" elapsed="0.329108"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.023866" elapsed="0.329593"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:38.021179" elapsed="0.332338"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:38.365634" level="FAIL">Variable '${original_owner}' not found.</msg>
<arg>${original_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:38.361838" elapsed="0.003837">Variable '${original_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:38.020561" elapsed="0.345275">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t13" name="Kill Candidate Instance" 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-07T17:21:38.369234" elapsed="0.000246"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:38.368954" elapsed="0.000580"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.370543" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.370427" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.370408" 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-07T17:21:38.375249" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.375143" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.375125" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.376341" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:38.375941" elapsed="0.000427"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.376828" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:38.376522" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:38.376898" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:38.377069" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:38.375566" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.382264" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.382157" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.382138" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.383565" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.383441" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.383423" elapsed="0.000208"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.384155" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.383771" elapsed="0.000410"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.384596" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.384336" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.413668" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.385170" elapsed="0.028658"/>
</kw>
<msg time="2026-04-07T17:21:38.414035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.414083" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.384775" elapsed="0.029343"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.455736" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.414672" elapsed="0.041243"/>
</kw>
<msg time="2026-04-07T17:21:38.456104" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.456149" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.414288" elapsed="0.041941"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.456527" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.456308" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.456289" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.457154" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.456769" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.457505" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.457296" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.457278" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.457635" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.459954" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.461400" elapsed="0.000472"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.462778" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.458500" elapsed="0.004686"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.457904" elapsed="0.005392"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.383143" elapsed="0.080252"/>
</kw>
<msg time="2026-04-07T17:21:38.463500" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.463543" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.382481" elapsed="0.081096"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.463760" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.463654" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.463635" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.464251" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.464572" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.464642" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.381811" elapsed="0.082936"/>
</kw>
<msg time="2026-04-07T17:21:38.464838" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.464880" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.377465" elapsed="0.087450"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.465259" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.465017" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.464998" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:38.377329" elapsed="0.088029"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.470719" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.470612" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.470594" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.472372" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.472265" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.472247" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.472994" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.472618" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.473428" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.473174" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.504650" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.473998" elapsed="0.030838"/>
</kw>
<msg time="2026-04-07T17:21:38.505035" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.505082" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.473607" elapsed="0.031510"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.549689" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.505691" elapsed="0.044183"/>
</kw>
<msg time="2026-04-07T17:21:38.550061" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.550106" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.505289" elapsed="0.044854"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.550437" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.550220" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.550200" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.551067" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.550678" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.551445" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.551208" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.551190" elapsed="0.000355"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.551577" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.553842" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:21:38.555290" elapsed="0.000470"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.556653" elapsed="0.000312"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.552418" elapsed="0.004638"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.551833" elapsed="0.005335"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.471860" elapsed="0.085407"/>
</kw>
<msg time="2026-04-07T17:21:38.557356" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.557398" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.470933" elapsed="0.086500"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.557613" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.557508" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.557490" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.558084" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.558415" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.558527" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.470277" elapsed="0.088359"/>
</kw>
<msg time="2026-04-07T17:21:38.558727" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.558769" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.465616" elapsed="0.093187"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.559148" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.558877" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.558860" elapsed="0.000366"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:38.465478" elapsed="0.093770"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.564643" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.564537" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.564519" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.565927" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.565806" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.565784" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.566500" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.566147" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.566925" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.566675" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.595416" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.567593" elapsed="0.027982"/>
</kw>
<msg time="2026-04-07T17:21:38.595742" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.595788" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.567198" elapsed="0.028624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.639803" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.596407" elapsed="0.043605"/>
</kw>
<msg time="2026-04-07T17:21:38.640180" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.640224" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.596027" elapsed="0.044231"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.640545" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.640333" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.640313" elapsed="0.000331"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.641205" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "K "i "l "l "[C "C "a "n "d "i "d "a "t "e "[C "I "n "s "t "[78Ca "[A[78Cn
 "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.640807" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.641547" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.641342" elapsed="0.000278"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.641324" elapsed="0.000320"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.641675" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.643964" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:21:38.645470" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.646854" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.642501" elapsed="0.004758"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.641923" elapsed="0.005466"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.565484" elapsed="0.082005"/>
</kw>
<msg time="2026-04-07T17:21:38.647579" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.647622" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.564857" elapsed="0.082801"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.647843" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.647734" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.647715" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.648322" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.648642" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.648712" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.564202" elapsed="0.084619"/>
</kw>
<msg time="2026-04-07T17:21:38.648912" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.648955" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.559516" elapsed="0.089503"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.649335" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.649095" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.649078" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:38.559367" elapsed="0.090066"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:38.377151" elapsed="0.272310"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:38.374775" elapsed="0.274740"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:38.370133" elapsed="0.279436"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.369681" elapsed="0.279933"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:38.366914" elapsed="0.282752"/>
</kw>
<kw name="Kill_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:21:38.655572" level="FAIL">Variable '${original_candidate}' not found.</msg>
<var>${new_cluster_list}</var>
<arg>${original_candidate}</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-07T17:21:38.649909" elapsed="0.005700">Variable '${original_candidate}' not found.</status>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_cluster_list}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.655783" elapsed="0.000022"/>
</kw>
<doc>Kill Owner Instance and verify it is dead</doc>
<status status="FAIL" start="2026-04-07T17:21:38.366314" elapsed="0.289621">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t14" name="Check Shards Status After Fail" line="76">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:38.659132" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:38.658861" 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-07T17:21:38.660384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.660277" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.660259" 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-07T17:21:38.665055" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.664851" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.664834" elapsed="0.000295"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.666123" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:38.665714" elapsed="0.000436"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.666603" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:38.666303" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:38.666672" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:38.666823" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:38.665347" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.721371" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.721226" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.721200" elapsed="0.000257"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.722843" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.722738" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.722720" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.723495" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.723076" elapsed="0.000447"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.723946" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.723682" elapsed="0.000306"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.752905" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.724528" elapsed="0.028554"/>
</kw>
<msg time="2026-04-07T17:21:38.753255" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.753300" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.724146" elapsed="0.029189"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.820081" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.753887" elapsed="0.066381"/>
</kw>
<msg time="2026-04-07T17:21:38.820436" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.820481" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.753501" elapsed="0.067015"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.820810" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.820593" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.820573" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.821444" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.821070" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.821801" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.821589" elapsed="0.000287"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.821571" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.821932" elapsed="0.000049"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.824300" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:21:38.825861" elapsed="0.000517"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.827329" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.822805" elapsed="0.004924"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.822227" elapsed="0.005622"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.722433" elapsed="0.105516"/>
</kw>
<msg time="2026-04-07T17:21:38.828056" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.828099" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.721650" elapsed="0.106484"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.828315" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.828210" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.828192" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.828782" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.829123" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.829194" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.720707" elapsed="0.108593"/>
</kw>
<msg time="2026-04-07T17:21:38.829392" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.829435" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.667217" elapsed="0.162253"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.829784" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.829544" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.829527" elapsed="0.000333"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:38.667081" elapsed="0.162802"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.835272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.835149" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.835131" elapsed="0.000218"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.836534" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.836430" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.836413" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.837107" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.836739" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.837538" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.837284" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.870281" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.838170" elapsed="0.032275"/>
</kw>
<msg time="2026-04-07T17:21:38.870632" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.870679" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.837716" elapsed="0.032998"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.919811" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.871315" elapsed="0.048750"/>
</kw>
<msg time="2026-04-07T17:21:38.920236" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:38.920281" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.870885" elapsed="0.049431"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.920614" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.920393" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.920372" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:38.921248" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:38.920852" elapsed="0.000474"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.921604" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.921393" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.921375" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:38.921736" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:38.924050" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.925569" elapsed="0.000493"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:38.926964" elapsed="0.000355"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:38.922580" elapsed="0.004809"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:38.922009" elapsed="0.005494"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.836133" elapsed="0.091469"/>
</kw>
<msg time="2026-04-07T17:21:38.927690" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.927733" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.835496" elapsed="0.092272"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:38.927950" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-07T17:21:38.927844" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.927826" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.928425" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.928745" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.928816" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.834798" elapsed="0.094123"/>
</kw>
<msg time="2026-04-07T17:21:38.929043" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:38.929088" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.830191" elapsed="0.098931"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:38.929440" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:38.929198" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.929181" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:38.830054" elapsed="0.099485"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.934838" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.934732" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.934713" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:38.936164" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:38.936057" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:38.936039" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:38.936720" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:38.936369" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.937264" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:38.936897" elapsed="0.000392"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:38.967230" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:38.937820" elapsed="0.029570"/>
</kw>
<msg time="2026-04-07T17:21:38.967555" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:38.967601" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.937442" elapsed="0.030193"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.013310" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:38.968206" elapsed="0.045289"/>
</kw>
<msg time="2026-04-07T17:21:39.013663" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.013708" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.967799" elapsed="0.045948"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.014068" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.013824" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.013804" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.014668" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.014305" elapsed="0.000440"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.015036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.014810" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.014793" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.015196" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.017473" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:21:39.018924" elapsed="0.000498"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.020315" elapsed="0.000312"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.016033" elapsed="0.004663"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.015449" elapsed="0.005358"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:38.935728" elapsed="0.085177"/>
</kw>
<msg time="2026-04-07T17:21:39.021011" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.021055" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.935100" elapsed="0.085990"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.021271" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.021166" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.021147" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.021729" elapsed="0.000066"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.022116" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.022187" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:38.934393" elapsed="0.087902"/>
</kw>
<msg time="2026-04-07T17:21:39.022385" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.022427" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.929790" elapsed="0.092671"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.022776" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.022534" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.022517" elapsed="0.000335"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:38.929656" elapsed="0.093219"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:38.666899" elapsed="0.356006"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:38.664498" elapsed="0.358462"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:38.659991" elapsed="0.363067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:38.659557" elapsed="0.363545"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:38.656806" elapsed="0.366347"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:39.027652" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Check Shard Status after some cluster event.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.023374" elapsed="0.004318">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="FAIL" start="2026-04-07T17:21:38.656250" elapsed="0.371599">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s2-t15" name="Check Entity Owner Status And Find Owner and Candidate After Fail" 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-07T17:21:39.031133" elapsed="0.000224"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:39.030860" 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-07T17:21:39.032406" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.032299" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.032281" 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-07T17:21:39.037008" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.036890" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.036873" elapsed="0.000204"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.038053" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:39.037659" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.038533" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:39.038234" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:39.038603" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:39.038754" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:39.037293" elapsed="0.001485"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.043958" elapsed="0.000029"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.043853" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.043835" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.045221" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.045116" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.045098" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.045822" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.045465" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.046270" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.046019" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.077309" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.046832" elapsed="0.030634"/>
</kw>
<msg time="2026-04-07T17:21:39.077635" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.077681" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.046451" elapsed="0.031264"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.153323" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.078284" elapsed="0.075233"/>
</kw>
<msg time="2026-04-07T17:21:39.153683" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.153728" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.077881" elapsed="0.075882"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.154075" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.153840" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.153820" elapsed="0.000357"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.154681" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.154316" elapsed="0.000452"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.155061" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.154835" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.154817" elapsed="0.000354"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.155204" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.157470" elapsed="0.000518"/>
</kw>
<kw name="Open 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-07T17:21:39.158884" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.160296" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.156040" elapsed="0.004638"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.155453" elapsed="0.005336"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.044793" elapsed="0.116097"/>
</kw>
<msg time="2026-04-07T17:21:39.160995" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.161040" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.044187" elapsed="0.116889"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.161257" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.161152" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.161133" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.161711" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.162092" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.162164" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.043517" elapsed="0.118754"/>
</kw>
<msg time="2026-04-07T17:21:39.162361" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.162404" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.039179" elapsed="0.123260"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.162759" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.162513" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.162496" elapsed="0.000343"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:39.039016" elapsed="0.123846"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.168299" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.168191" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.168171" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.169540" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.169436" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.169418" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.170106" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.169742" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.170535" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.170283" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.202958" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.171183" elapsed="0.031994"/>
</kw>
<msg time="2026-04-07T17:21:39.203345" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.203390" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.170712" elapsed="0.032713"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.283611" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.203997" elapsed="0.079820"/>
</kw>
<msg time="2026-04-07T17:21:39.284013" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.284061" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.203591" elapsed="0.080506"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.284405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.284178" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.284156" elapsed="0.000353"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.285044" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.284650" elapsed="0.000483"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.285423" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.285200" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.285182" elapsed="0.000360"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.285614" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.287906" elapsed="0.000517"/>
</kw>
<kw name="Open 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-07T17:21:39.289347" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.290707" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.286473" elapsed="0.004660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.285880" elapsed="0.005375"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.169139" elapsed="0.122220"/>
</kw>
<msg time="2026-04-07T17:21:39.291449" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.291492" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.168512" elapsed="0.123015"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.291708" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.291603" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.291584" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.292184" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.292511" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.292581" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.167664" elapsed="0.125024"/>
</kw>
<msg time="2026-04-07T17:21:39.292800" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.292847" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.163170" elapsed="0.129711"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.293223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.292955" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.292938" elapsed="0.000362"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:39.163018" elapsed="0.130305"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.298680" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.298574" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.298555" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.299944" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.299839" elapsed="0.000249"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.299821" elapsed="0.000291"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.300603" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.300252" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.301052" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.300784" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.328797" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.301609" elapsed="0.027352"/>
</kw>
<msg time="2026-04-07T17:21:39.329156" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.329203" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.301233" elapsed="0.028005"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.401508" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.329809" elapsed="0.071935"/>
</kw>
<msg time="2026-04-07T17:21:39.401914" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.401960" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.329410" elapsed="0.072608"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.402323" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.402099" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.402078" elapsed="0.000347"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.402933" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "n "d "[C "F "i "n "d "[C "O "w "n "e "r "[C "a "n "d "[C "C "a "n "d "i "d "a "t "e "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.402562" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.403331" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.403120" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.403102" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.403462" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.405736" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.407265" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.408635" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.404296" elapsed="0.004745"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.403707" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.299539" elapsed="0.109715"/>
</kw>
<msg time="2026-04-07T17:21:39.409344" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.409386" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.298893" elapsed="0.110529"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.409604" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.409497" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.409479" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.410130" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.410458" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.410529" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.298237" elapsed="0.112398"/>
</kw>
<msg time="2026-04-07T17:21:39.410727" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.410770" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.293576" elapsed="0.117229"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.411163" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.410879" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.410862" elapsed="0.000379"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:39.293442" elapsed="0.117863"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:39.038833" elapsed="0.372505"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:39.036539" elapsed="0.374856"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:39.032017" elapsed="0.379434"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.031553" elapsed="0.379943"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:39.028758" elapsed="0.382791"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:39.423399" level="FAIL">Variable '${original_owner}' not found.</msg>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>${original_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.419639" elapsed="0.003799">Variable '${original_owner}' not found.</status>
</kw>
<kw name="Get From List" owner="Collections">
<var>${new_candidate}</var>
<arg>${new_candidate_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.423612" 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-07T17:21:39.423791" elapsed="0.000020"/>
</kw>
<kw name="Set Suite Variable" owner="BuiltIn">
<arg>${new_candidate}</arg>
<doc>Makes a variable available everywhere within the scope of the current suite.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.423956" elapsed="0.000035"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.028192" elapsed="0.395941">Variable '${original_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t16" name="Create Bridge Manually and Verify After Fail" line="90">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:39.427306" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:39.427047" elapsed="0.000519"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.428538" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.428428" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.428410" 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-07T17:21:39.433142" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.433036" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.433018" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.434191" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:39.433796" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.434671" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:39.434372" elapsed="0.000324"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:39.434740" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:39.434891" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:39.433426" elapsed="0.001489"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.440247" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.440141" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.440122" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.441494" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.441390" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.441372" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.442063" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.441697" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.442492" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.442243" elapsed="0.000275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.471065" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.443092" elapsed="0.028147"/>
</kw>
<msg time="2026-04-07T17:21:39.471464" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.471510" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.442672" elapsed="0.028874"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.527832" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.472112" elapsed="0.055968"/>
</kw>
<msg time="2026-04-07T17:21:39.528251" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.528297" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.471713" elapsed="0.056620"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.528629" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.528411" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.528391" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.529254" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.528867" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.529613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.529405" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.529387" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.529744" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.532050" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:21:39.533484" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.534866" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.530574" elapsed="0.004714"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.530007" elapsed="0.005394"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.441091" elapsed="0.094410"/>
</kw>
<msg time="2026-04-07T17:21:39.535591" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.535635" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.440460" elapsed="0.095211"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.535855" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.535748" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.535728" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.536329" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.536655" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.536726" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.439757" elapsed="0.097074"/>
</kw>
<msg time="2026-04-07T17:21:39.536923" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.536997" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.435300" elapsed="0.101735"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.537399" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.537153" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.537135" elapsed="0.000340"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:39.435166" elapsed="0.102332"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.542784" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.542678" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.542660" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.544044" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.543923" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.543905" elapsed="0.000207"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.544595" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.544248" elapsed="0.000373"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.545127" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.544772" elapsed="0.000383"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.575269" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.545685" elapsed="0.029746"/>
</kw>
<msg time="2026-04-07T17:21:39.575599" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.575645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.545308" elapsed="0.030372"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.634440" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.576258" elapsed="0.058366"/>
</kw>
<msg time="2026-04-07T17:21:39.634789" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.634834" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.575850" elapsed="0.059042"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.635210" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.634993" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.634951" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.635807" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.635445" elapsed="0.000444"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.636177" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.635954" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.635936" elapsed="0.000340"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.636308" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.638544" elapsed="0.000531"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.639964" elapsed="0.000483"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.641343" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.637133" elapsed="0.004596"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.636554" elapsed="0.005289"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.543629" elapsed="0.098372"/>
</kw>
<msg time="2026-04-07T17:21:39.642093" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.642137" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.543026" elapsed="0.099147"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.642353" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.642249" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.642230" elapsed="0.000204"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.642809" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.643163" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.643234" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.542344" elapsed="0.100997"/>
</kw>
<msg time="2026-04-07T17:21:39.643432" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.643475" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.537754" elapsed="0.105756"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.643823" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.643583" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.643566" elapsed="0.000333"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:39.537617" elapsed="0.106305"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.649292" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.649187" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.649168" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.650536" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.650433" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.650415" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.651124" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.650738" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.651554" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.651302" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.681912" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.652160" elapsed="0.029933"/>
</kw>
<msg time="2026-04-07T17:21:39.682259" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.682305" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.651734" elapsed="0.030606"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.739544" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.682918" elapsed="0.056814"/>
</kw>
<msg time="2026-04-07T17:21:39.739898" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.739944" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.682506" elapsed="0.057493"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.740291" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.740077" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.740057" elapsed="0.000367"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.740931" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.740562" elapsed="0.000470"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.741305" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.741098" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.741080" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.741437" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.743866" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:21:39.745318" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.746698" elapsed="0.000354"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.742261" elapsed="0.004860"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.741681" elapsed="0.005556"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.650134" elapsed="0.097202"/>
</kw>
<msg time="2026-04-07T17:21:39.747425" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.747469" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.649504" elapsed="0.098000"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.747685" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.747580" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.747561" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.748158" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.748480" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.748550" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.648838" elapsed="0.099818"/>
</kw>
<msg time="2026-04-07T17:21:39.748752" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.748795" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.644205" elapsed="0.104625"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.749175" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.748904" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.748887" elapsed="0.000365"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:39.644071" elapsed="0.105204"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:39.434996" elapsed="0.314307"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:39.432661" elapsed="0.316694"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:39.428144" elapsed="0.321264"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.427710" elapsed="0.321743"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:39.425058" elapsed="0.324447"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:39.757560" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.753558" elapsed="0.004071">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.424451" elapsed="0.333325">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s2-t17" name="Add Port Manually and Verify After Fail" line="94">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:39.760858" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:39.760604" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.762106" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.761997" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.761963" 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-07T17:21:39.766686" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.766582" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.766564" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.767765" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:39.767381" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.768265" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:39.767946" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:39.768335" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:39.768486" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:39.767008" elapsed="0.001502"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.774682" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.774577" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.774558" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.775935" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.775830" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.775812" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.776519" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.776167" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.776954" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.776699" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.806412" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.777530" elapsed="0.029057"/>
</kw>
<msg time="2026-04-07T17:21:39.806758" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.806834" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.777153" elapsed="0.029717"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.861963" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.807447" elapsed="0.054718"/>
</kw>
<msg time="2026-04-07T17:21:39.862332" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.862377" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.807059" elapsed="0.055352"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.862709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.862489" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.862469" elapsed="0.000416"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.863427" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.863051" elapsed="0.000458"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.863783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.863575" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.863557" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.863915" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.866255" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:21:39.867712" elapsed="0.000512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.869145" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.864777" elapsed="0.004766"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.864200" elapsed="0.005457"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.775533" elapsed="0.094227"/>
</kw>
<msg time="2026-04-07T17:21:39.869856" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.869900" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.774908" elapsed="0.095026"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.870135" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.870028" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.870008" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.870610" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.870959" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.871047" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.774239" elapsed="0.096916"/>
</kw>
<msg time="2026-04-07T17:21:39.871249" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.871291" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.768859" elapsed="0.102468"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.871645" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.871402" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.871385" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:39.768725" elapsed="0.103021"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.877206" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.877100" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.877082" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.878455" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.878350" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.878332" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.879048" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.878659" elapsed="0.000416"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.879485" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.879227" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.910835" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.880146" elapsed="0.030872"/>
</kw>
<msg time="2026-04-07T17:21:39.911185" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:39.911230" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.879703" elapsed="0.031561"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.975106" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:39.911811" elapsed="0.063481"/>
</kw>
<msg time="2026-04-07T17:21:39.975458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:39.975503" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.911430" elapsed="0.064108"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.975828" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.975614" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.975594" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:39.976459" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:39.976089" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.976814" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.976607" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.976589" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:39.976945" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:39.979248" elapsed="0.000506"/>
</kw>
<kw name="Open 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-07T17:21:39.980673" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:39.982081" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:39.977778" elapsed="0.004691"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:39.977215" elapsed="0.005368"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.878052" elapsed="0.104630"/>
</kw>
<msg time="2026-04-07T17:21:39.982799" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.982842" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.877417" elapsed="0.105461"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:39.983076" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:39.982954" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.982935" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.983536" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.983860" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.983929" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.876743" elapsed="0.107309"/>
</kw>
<msg time="2026-04-07T17:21:39.984219" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:39.984263" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.872046" elapsed="0.112252"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:39.984615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:39.984373" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.984356" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:39.871876" elapsed="0.112839"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.990151" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.990041" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.990020" elapsed="0.000199"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:39.991440" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:39.991335" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:39.991317" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:39.992019" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:39.991645" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:39.992454" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:39.992200" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.021830" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:39.993035" elapsed="0.028972"/>
</kw>
<msg time="2026-04-07T17:21:40.022177" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.022224" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.992635" elapsed="0.029624"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.086071" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.022832" elapsed="0.063436"/>
</kw>
<msg time="2026-04-07T17:21:40.086443" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.086491" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.022426" elapsed="0.064101"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.086864" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.086607" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.086587" elapsed="0.000399"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.087506" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.087128" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.087865" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.087653" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.087635" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.088014" elapsed="0.000029"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.090272" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:21:40.091695" elapsed="0.000484"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.093073" elapsed="0.000352"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.088836" elapsed="0.004660"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.088266" elapsed="0.005342"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:39.991036" elapsed="0.102670"/>
</kw>
<msg time="2026-04-07T17:21:40.093797" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.093840" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.990366" elapsed="0.103510"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.094076" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.093953" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.093934" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.094539" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.094887" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.094959" elapsed="0.000030"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:39.989647" elapsed="0.105436"/>
</kw>
<msg time="2026-04-07T17:21:40.095176" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.095219" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.985000" elapsed="0.110253"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.095571" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.095327" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.095310" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:39.984833" elapsed="0.110839"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:39.768562" elapsed="0.327138"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:39.766226" elapsed="0.329530"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:39.761694" elapsed="0.334117"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:39.761287" elapsed="0.334569"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:39.758627" elapsed="0.337279"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:40.104022" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.100203" elapsed="0.003859">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:39.758074" elapsed="0.346140">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s2-t18" name="Delete the Bridge Manually and Verify After Fail" line="98">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:40.107430" elapsed="0.000212"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:40.107174" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.108659" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.108551" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.108533" 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-07T17:21:40.113250" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.113146" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.113128" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.114292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:40.113898" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.114843" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:40.114512" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:40.114914" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:40.115083" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:40.113532" elapsed="0.001576"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.120270" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.120164" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.120146" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.121527" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.121422" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.121404" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.122371" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.122011" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.122821" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.122549" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.152844" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.123405" elapsed="0.029615"/>
</kw>
<msg time="2026-04-07T17:21:40.153190" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.153236" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.123024" elapsed="0.030246"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.222545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.153821" elapsed="0.068944"/>
</kw>
<msg time="2026-04-07T17:21:40.222935" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.223003" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.153437" elapsed="0.069603"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.223336" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.223118" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.223098" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.223957" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.223573" elapsed="0.000486"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.224334" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.224126" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.224108" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.224465" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.226795" elapsed="0.000760"/>
</kw>
<kw name="Open 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-07T17:21:40.228526" elapsed="0.000526"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.229955" elapsed="0.000334"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.225297" elapsed="0.005106"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.224711" elapsed="0.005811"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.121111" elapsed="0.109524"/>
</kw>
<msg time="2026-04-07T17:21:40.230726" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.230773" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.120482" elapsed="0.110326"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.231007" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.230885" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.230866" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.231464" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.231786" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.231857" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.119817" elapsed="0.112145"/>
</kw>
<msg time="2026-04-07T17:21:40.232117" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.232161" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.115459" elapsed="0.116737"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.232512" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.232270" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.232253" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:40.115324" elapsed="0.117286"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.237934" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.237828" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.237810" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.239211" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.239106" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.239088" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.239763" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.239415" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.240240" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.239941" elapsed="0.000325"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.270083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.240815" elapsed="0.029426"/>
</kw>
<msg time="2026-04-07T17:21:40.270409" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.270455" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.240418" elapsed="0.030071"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.332586" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.271092" elapsed="0.061694"/>
</kw>
<msg time="2026-04-07T17:21:40.332960" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.333028" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.270688" elapsed="0.062412"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.333400" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.333182" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.333160" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.334022" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.333639" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.334384" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.334174" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.334155" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.334516" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.336817" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:21:40.338275" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.339654" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.335368" elapsed="0.004695"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.334784" elapsed="0.005391"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.238792" elapsed="0.101482"/>
</kw>
<msg time="2026-04-07T17:21:40.340364" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.340406" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.238166" elapsed="0.102275"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.340623" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.340518" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.340500" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.341189" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.341517" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.341587" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.237492" elapsed="0.104200"/>
</kw>
<msg time="2026-04-07T17:21:40.341784" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.341826" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.232862" elapsed="0.108999"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.342192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.341934" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.341918" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:40.232728" elapsed="0.109564"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.347605" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.347499" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.347481" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.348919" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.348814" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.348797" elapsed="0.000245"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.349540" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.349186" elapsed="0.000380"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.349985" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.349718" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.378475" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.350581" elapsed="0.028074"/>
</kw>
<msg time="2026-04-07T17:21:40.378821" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.378867" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.350168" elapsed="0.028733"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.445835" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.379507" elapsed="0.066537"/>
</kw>
<msg time="2026-04-07T17:21:40.446212" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.446257" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.379122" elapsed="0.067169"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.446601" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.446367" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.446348" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.447223" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.446837" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.447578" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.447370" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.447353" elapsed="0.000322"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.447706" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.450005" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:21:40.451483" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.452863" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.448535" elapsed="0.004731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.447953" elapsed="0.005426"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.348518" elapsed="0.104960"/>
</kw>
<msg time="2026-04-07T17:21:40.453566" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.453609" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.347822" elapsed="0.105822"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.453825" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.453719" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.453701" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.454298" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.454691" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.454763" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.347165" elapsed="0.107706"/>
</kw>
<msg time="2026-04-07T17:21:40.454961" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.455037" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.342558" elapsed="0.112514"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.455389" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.455145" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.455129" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:40.342410" elapsed="0.113078"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:40.115160" elapsed="0.340356"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:40.112777" elapsed="0.342791"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:40.108270" elapsed="0.347353"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.107840" elapsed="0.347826"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:40.105186" elapsed="0.350532"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:40.463748" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>controller_index_list=${new_cluster_list}</arg>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.459880" elapsed="0.003906">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.104565" elapsed="0.359355">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s2-t19" name="Create Bridge In Owner and Verify After Fail" line="102">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:40.467042" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:40.466754" 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-07T17:21:40.468272" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.468166" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.468148" 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-07T17:21:40.472833" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.472728" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.472711" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.473877" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:40.473498" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.474373" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:40.474072" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:40.474444" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:40.474625" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:40.473130" elapsed="0.001519"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.479801" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.479695" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.479677" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.481064" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.480935" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.480917" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.481616" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.481268" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.482105" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.481830" elapsed="0.000301"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.516559" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.482686" elapsed="0.034032"/>
</kw>
<msg time="2026-04-07T17:21:40.516886" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.516932" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.482285" elapsed="0.034742"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.574708" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.517585" elapsed="0.057317"/>
</kw>
<msg time="2026-04-07T17:21:40.575095" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.575140" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.517199" elapsed="0.057975"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.575473" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.575253" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.575233" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.576097" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.575711" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.576456" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.576245" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.576227" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.576587" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.578876" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:21:40.580334" elapsed="0.000462"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.581709" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.577419" elapsed="0.004695"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.576836" elapsed="0.005391"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.480638" elapsed="0.101689"/>
</kw>
<msg time="2026-04-07T17:21:40.582430" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.582475" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.480030" elapsed="0.102480"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.582693" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.582586" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.582568" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.583167" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.583489" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.583597" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.479363" elapsed="0.104342"/>
</kw>
<msg time="2026-04-07T17:21:40.583796" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.583838" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.475019" elapsed="0.108854"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.584223" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.583948" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.583930" elapsed="0.000371"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:40.474868" elapsed="0.109456"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.589723" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.589617" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.589599" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.591025" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.590895" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.590877" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.591581" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.591230" elapsed="0.000378"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.592029" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.591760" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.624003" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.592591" elapsed="0.031782"/>
</kw>
<msg time="2026-04-07T17:21:40.624744" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.624845" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.592212" elapsed="0.032710"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.681501" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.626228" elapsed="0.055468"/>
</kw>
<msg time="2026-04-07T17:21:40.681868" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.681912" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.625348" elapsed="0.056599"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.682266" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.682046" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.682026" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.682898" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.682532" elapsed="0.000465"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.683275" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.683065" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.683047" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.683405" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.685718" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:21:40.687199" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.688573" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.684244" elapsed="0.004717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.683652" elapsed="0.005439"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.590592" elapsed="0.098599"/>
</kw>
<msg time="2026-04-07T17:21:40.689281" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.689324" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.589936" elapsed="0.099422"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.689541" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.689435" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.689416" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.690009" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.690329" elapsed="0.000037"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.690414" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.589283" elapsed="0.101238"/>
</kw>
<msg time="2026-04-07T17:21:40.690612" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.690656" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.584578" elapsed="0.106112"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.691044" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.690765" elapsed="0.000335"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.690748" elapsed="0.000376"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:40.584444" elapsed="0.106703"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.696484" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.696378" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.696359" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.697721" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.697617" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.697599" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.698293" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.697929" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.698742" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.698490" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.731344" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.699388" elapsed="0.032125"/>
</kw>
<msg time="2026-04-07T17:21:40.731681" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.731726" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.698919" elapsed="0.032841"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.795152" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.732330" elapsed="0.063047"/>
</kw>
<msg time="2026-04-07T17:21:40.795544" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.795589" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.731925" elapsed="0.063699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.795921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.795700" elapsed="0.000318"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.795680" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.796547" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "w "[78Cn "[A[78Ce
 "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.796183" elapsed="0.000445"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.796903" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.796694" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.796676" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.797052" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.799326" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:21:40.800728" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.802107" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.797862" elapsed="0.004644"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.797301" elapsed="0.005316"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.697320" elapsed="0.105395"/>
</kw>
<msg time="2026-04-07T17:21:40.802803" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.802846" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.696699" elapsed="0.106181"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.803080" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.802956" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.802937" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.803535" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.803861" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.803931" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.695870" elapsed="0.108185"/>
</kw>
<msg time="2026-04-07T17:21:40.804148" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.804191" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.691400" elapsed="0.112826"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.804545" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.804302" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.804285" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:40.691266" elapsed="0.113379"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:40.474700" elapsed="0.329973"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:40.472376" elapsed="0.332350"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:40.467864" elapsed="0.336952"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.467450" elapsed="0.337412"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:40.464785" elapsed="0.340129"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:40.816549" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.813053" elapsed="0.003532">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.464229" elapsed="0.352492">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t20" name="Create Port In Owner and Verify After Fail" line="106">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:40.819815" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:40.819560" 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-07T17:21:40.821067" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.820943" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.820925" 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-07T17:21:40.825636" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.825530" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.825512" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.826695" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:40.826319" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.827199" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:40.826875" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:40.827268" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:40.827419" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:40.825918" elapsed="0.001524"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.833490" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.833385" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.833366" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.834949" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.834843" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.834825" elapsed="0.000213"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.835530" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.835177" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.835959" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.835707" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.865524" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.836537" elapsed="0.029157"/>
</kw>
<msg time="2026-04-07T17:21:40.865861" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.865906" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.836160" elapsed="0.029781"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.922474" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.866519" elapsed="0.056146"/>
</kw>
<msg time="2026-04-07T17:21:40.922832" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:40.922911" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.866122" elapsed="0.056826"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.923260" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.923046" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.923026" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:40.923859" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:40.923496" elapsed="0.000443"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.924233" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.924025" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.924005" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:40.924363" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:40.926633" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:21:40.928089" elapsed="0.000461"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:40.929461" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:40.925191" elapsed="0.004657"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:40.924609" elapsed="0.005354"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.834545" elapsed="0.095537"/>
</kw>
<msg time="2026-04-07T17:21:40.930173" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.930216" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.833701" elapsed="0.096576"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:40.930459" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:40.930354" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.930336" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.930919" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.931257" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.931327" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.833049" elapsed="0.098383"/>
</kw>
<msg time="2026-04-07T17:21:40.931522" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:40.931565" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.827790" elapsed="0.103809"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:40.931914" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:40.931673" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.931656" elapsed="0.000365"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:40.827655" elapsed="0.104390"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.937337" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.937231" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.937212" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:40.938595" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:40.938490" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:40.938473" elapsed="0.000232"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:40.939504" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:40.938844" elapsed="0.000686"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.939937" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:40.939684" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:40.970512" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:40.940512" elapsed="0.030157"/>
</kw>
<msg time="2026-04-07T17:21:40.970836" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:40.970882" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.940134" elapsed="0.030783"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.050509" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:40.971486" elapsed="0.079215"/>
</kw>
<msg time="2026-04-07T17:21:41.050875" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.050922" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.971103" elapsed="0.079854"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.051283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.051059" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.051039" elapsed="0.000346"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.051904" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.051524" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.052288" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.052074" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.052056" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.052422" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.054695" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:21:41.056137" elapsed="0.000459"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.057495" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.053261" elapsed="0.004621"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.052670" elapsed="0.005343"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:40.938177" elapsed="0.119935"/>
</kw>
<msg time="2026-04-07T17:21:41.058233" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.058279" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.937548" elapsed="0.120767"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.058499" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.058393" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.058374" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.059012" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.059377" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.059448" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:40.936873" elapsed="0.122680"/>
</kw>
<msg time="2026-04-07T17:21:41.059644" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.059687" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.932298" elapsed="0.127424"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.060069" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.059796" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.059779" elapsed="0.000368"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:40.932163" elapsed="0.128007"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.065509" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.065403" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.065384" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.066837" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.066713" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.066696" elapsed="0.000223"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.067478" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.067127" elapsed="0.000377"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.067909" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.067657" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.096334" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.068485" elapsed="0.028004"/>
</kw>
<msg time="2026-04-07T17:21:41.096655" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.096701" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.068107" elapsed="0.028628"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.163786" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.097300" elapsed="0.066702"/>
</kw>
<msg time="2026-04-07T17:21:41.164181" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.164226" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.096898" elapsed="0.067363"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.164555" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.164337" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.164318" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.165193" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "[78Cr "[A[78C
 "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.164792" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.165549" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.165339" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.165321" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.165680" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.168072" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.169513" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.170907" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.166580" elapsed="0.004734"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.165980" elapsed="0.005447"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.066416" elapsed="0.105111"/>
</kw>
<msg time="2026-04-07T17:21:41.171618" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.171661" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.065721" elapsed="0.105975"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.171877" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.171771" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.171753" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.172370" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.172692" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.172762" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.065066" elapsed="0.107801"/>
</kw>
<msg time="2026-04-07T17:21:41.172958" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.173018" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.060420" elapsed="0.112633"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.173370" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.173128" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.173111" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:41.060287" elapsed="0.113182"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:40.827492" elapsed="0.346005"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:40.825174" elapsed="0.348375"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:40.820656" elapsed="0.352946"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:40.820244" elapsed="0.353402"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:40.817578" elapsed="0.356118"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:41.185236" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:41.181750" elapsed="0.003523">Variable '${new_owner}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:40.817029" elapsed="0.368379">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t21" name="Modify the destination IP of Port In Owner After Fail" line="110">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:41.188462" elapsed="0.000206"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:41.188208" elapsed="0.000514"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.189685" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.189579" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.189561" 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-07T17:21:41.194334" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.194194" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.194176" elapsed="0.000227"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.195380" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:41.195003" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.195860" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:41.195560" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:41.195929" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:41.196100" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:41.194620" elapsed="0.001504"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.201321" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.201215" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.201196" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.202594" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.202489" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.202472" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.203166" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.202798" elapsed="0.000394"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.203593" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.203344" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.234141" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.204169" elapsed="0.030131"/>
</kw>
<msg time="2026-04-07T17:21:41.234467" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.234512" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.203771" elapsed="0.030775"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.309261" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.235151" elapsed="0.074544"/>
</kw>
<msg time="2026-04-07T17:21:41.310158" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.310265" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.234709" elapsed="0.075636"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.310891" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.310521" elapsed="0.000462"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.310477" elapsed="0.000533"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.311527" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.311149" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.311896" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.311683" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.311665" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.312045" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.314357" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.315835" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.317214" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.312872" elapsed="0.004728"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.312294" elapsed="0.005420"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.202191" elapsed="0.115624"/>
</kw>
<msg time="2026-04-07T17:21:41.317908" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.317952" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.201533" elapsed="0.116469"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.318200" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.318092" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.318073" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.318664" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.319019" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.319092" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.200862" elapsed="0.118336"/>
</kw>
<msg time="2026-04-07T17:21:41.319290" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.319332" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.196474" elapsed="0.122893"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.319682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.319440" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.319423" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:41.196340" elapsed="0.123441"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.325156" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.325048" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.325029" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.326412" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.326304" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.326286" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.326963" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.326616" elapsed="0.000441"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.327463" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.327211" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.356853" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.328032" elapsed="0.029012"/>
</kw>
<msg time="2026-04-07T17:21:41.357211" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.357258" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.327639" elapsed="0.029654"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.425182" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.357840" elapsed="0.067563"/>
</kw>
<msg time="2026-04-07T17:21:41.425569" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.425614" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.357455" elapsed="0.068195"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.425944" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.425727" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.425708" elapsed="0.000366"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.426578" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.426213" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.426944" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.426730" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.426712" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.427094" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.429330" elapsed="0.000505"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.430760" elapsed="0.000482"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.432136" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.427905" elapsed="0.004615"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.427343" elapsed="0.005288"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.325993" elapsed="0.106737"/>
</kw>
<msg time="2026-04-07T17:21:41.432826" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.432869" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.325368" elapsed="0.107536"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.433104" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.432996" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.432962" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.433558" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.433877" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.433947" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.324691" elapsed="0.109389"/>
</kw>
<msg time="2026-04-07T17:21:41.434171" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.434214" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.320047" elapsed="0.114202"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.434564" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.434323" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.434306" elapsed="0.000334"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:41.319898" elapsed="0.114764"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.440059" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.439937" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.439918" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.441365" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.441259" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.441241" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.441930" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.441571" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.442407" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.442153" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.472985" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.442989" elapsed="0.030159"/>
</kw>
<msg time="2026-04-07T17:21:41.473317" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.473363" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.442587" elapsed="0.030811"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.549142" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.473954" elapsed="0.075390"/>
</kw>
<msg time="2026-04-07T17:21:41.549513" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.549559" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.473563" elapsed="0.076031"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.549889" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.549672" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.549651" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.550555" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.550184" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.550915" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.550707" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.550689" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.551063" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.553337" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:21:41.554772" elapsed="0.000474"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.556140" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.551882" elapsed="0.004642"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.551311" elapsed="0.005326"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.440937" elapsed="0.115799"/>
</kw>
<msg time="2026-04-07T17:21:41.556828" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.556872" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.440318" elapsed="0.116589"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.557110" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.557003" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.556964" elapsed="0.000229"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.557610" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.557959" elapsed="0.000040"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.558047" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.439602" elapsed="0.118553"/>
</kw>
<msg time="2026-04-07T17:21:41.558246" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.558289" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.434912" elapsed="0.123413"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.558642" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.558400" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.558383" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:41.434779" elapsed="0.123963"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:41.196176" elapsed="0.362594"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:41.193811" elapsed="0.365013"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:41.189298" elapsed="0.369580"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.188869" elapsed="0.370053"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:41.186254" elapsed="0.372749"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:41.566725" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<arg>${new_cluster_list}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:21:41.563229" elapsed="0.003534">Variable '${new_owner}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:21:41.185692" elapsed="0.381212">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t22" name="Verify Port Is Modified After Fail" line="114">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:41.570229" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:41.569918" elapsed="0.000572"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.571450" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.571343" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.571325" 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-07T17:21:41.576086" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.575965" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.575948" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.577133" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:41.576740" elapsed="0.000420"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.577614" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:41.577313" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:41.577684" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:41.577836" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:41.576371" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.583046" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.582924" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.582905" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.584296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.584191" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.584174" elapsed="0.000226"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.584894" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.584542" elapsed="0.000379"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.585343" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.585092" elapsed="0.000277"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.613877" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.585900" elapsed="0.028168"/>
</kw>
<msg time="2026-04-07T17:21:41.614237" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.614283" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.585523" elapsed="0.028795"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.665957" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.614872" elapsed="0.051280"/>
</kw>
<msg time="2026-04-07T17:21:41.666322" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.666366" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.614484" elapsed="0.051917"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.666694" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.666477" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.666458" elapsed="0.000337"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.667323" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.666934" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.667677" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.667468" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.667451" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.667808" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.670115" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:21:41.671541" elapsed="0.000491"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.672931" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.668639" elapsed="0.004698"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.668071" elapsed="0.005379"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.583869" elapsed="0.089680"/>
</kw>
<msg time="2026-04-07T17:21:41.673639" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.673681" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.583259" elapsed="0.090457"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.673917" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.673792" elapsed="0.000198"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.673774" elapsed="0.000242"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.674394" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.674762" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.674835" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.582586" elapsed="0.092356"/>
</kw>
<msg time="2026-04-07T17:21:41.675051" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.675094" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.578243" elapsed="0.096886"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.675447" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.675204" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.675187" elapsed="0.000337"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:41.578107" elapsed="0.097440"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.680744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.680636" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.680617" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.682220" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.682113" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.682095" elapsed="0.000194"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.682781" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.682427" elapsed="0.000381"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.683248" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.682960" elapsed="0.000314"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.713205" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.683808" elapsed="0.029557"/>
</kw>
<msg time="2026-04-07T17:21:41.713534" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.713580" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.683428" elapsed="0.030187"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.766303" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.714250" elapsed="0.052250"/>
</kw>
<msg time="2026-04-07T17:21:41.766671" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.766717" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.713782" elapsed="0.052970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.767075" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.766833" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.766814" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.767684" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.767316" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.768055" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.767828" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.767811" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.768186" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.770536" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:21:41.772005" elapsed="0.000466"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.773388" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.769061" elapsed="0.004717"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.768475" elapsed="0.005443"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.681774" elapsed="0.092258"/>
</kw>
<msg time="2026-04-07T17:21:41.774124" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.774169" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.680961" elapsed="0.093243"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.774389" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.774282" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.774263" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.774850" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.775199" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.775271" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.680298" elapsed="0.095080"/>
</kw>
<msg time="2026-04-07T17:21:41.775470" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.775513" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.675799" elapsed="0.099749"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.775866" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.775622" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.775605" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:41.675665" elapsed="0.100331"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.781375" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.781269" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.781250" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.782650" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.782544" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.782526" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.783229" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.782856" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.783663" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.783409" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.813646" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.784312" elapsed="0.029520"/>
</kw>
<msg time="2026-04-07T17:21:41.814027" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.814074" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.783842" elapsed="0.030267"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.866779" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.814661" elapsed="0.052375"/>
</kw>
<msg time="2026-04-07T17:21:41.867216" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.867264" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.814275" elapsed="0.053025"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.867609" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.867381" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.867360" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.868252" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "F "a "i "l "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.867850" elapsed="0.000484"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.868615" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.868402" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.868384" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.868748" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.871075" elapsed="0.000510"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.872520" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.873909" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.869593" elapsed="0.004724"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.869015" elapsed="0.005414"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.782243" elapsed="0.092285"/>
</kw>
<msg time="2026-04-07T17:21:41.874618" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.874661" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.781591" elapsed="0.093105"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.874880" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.874773" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.874754" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.875359" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.875679" elapsed="0.000023"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.875749" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.780918" elapsed="0.094939"/>
</kw>
<msg time="2026-04-07T17:21:41.875949" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.876027" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.776253" elapsed="0.099810"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.876384" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.876139" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.876122" elapsed="0.000338"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:41.776118" elapsed="0.100365"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:41.577911" elapsed="0.298600"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:41.575607" elapsed="0.300956"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:41.571060" elapsed="0.305594"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.570632" elapsed="0.306069"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:41.567959" elapsed="0.308795"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<msg time="2026-04-07T17:21:41.884804" level="FAIL">Variable '${new_cluster_list}' not found.</msg>
<arg>${new_cluster_list}</arg>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:21:41.881044" elapsed="0.003798">Variable '${new_cluster_list}' not found.</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:21:41.567457" elapsed="0.317532">Variable '${new_cluster_list}' not found.</status>
</test>
<test id="s1-s2-s2-t23" name="Start Old Candidate Instance" line="118">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:41.888021" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:41.887734" 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-07T17:21:41.889252" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.889143" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.889125" 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-07T17:21:41.893869" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.893750" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.893732" elapsed="0.000205"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.894917" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:41.894540" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.895415" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:41.895113" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:41.895484" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:41.895635" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:41.894169" elapsed="0.001490"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.901798" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.901663" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.901644" elapsed="0.000224"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.903079" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.902946" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.902928" elapsed="0.000220"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.903635" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.903285" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.904085" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.903813" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.932888" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.904648" elapsed="0.028481"/>
</kw>
<msg time="2026-04-07T17:21:41.933300" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:41.933346" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.904266" elapsed="0.029115"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.977301" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:41.933952" elapsed="0.043544"/>
</kw>
<msg time="2026-04-07T17:21:41.977669" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:41.977714" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.933548" elapsed="0.044266"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.978145" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.977898" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.977878" elapsed="0.000372"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:41.978755" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:41.978385" elapsed="0.000447"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.979126" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.978898" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.978880" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:41.979261" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:41.981536" elapsed="0.000541"/>
</kw>
<kw name="Open 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-07T17:21:41.983014" elapsed="0.000463"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:41.984391" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:41.980095" elapsed="0.004685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:41.979508" elapsed="0.005391"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.902642" elapsed="0.082372"/>
</kw>
<msg time="2026-04-07T17:21:41.985107" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.985150" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.902031" elapsed="0.083154"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:41.985366" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:41.985261" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.985242" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.985837" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.986179" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.986250" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.901327" elapsed="0.085029"/>
</kw>
<msg time="2026-04-07T17:21:41.986447" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:41.986490" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.896023" elapsed="0.090501"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:41.986839" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:41.986598" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.986581" elapsed="0.000335"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:41.895872" elapsed="0.091067"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.992384" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.992277" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.992258" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:41.993620" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:41.993515" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:41.993497" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:41.994256" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:41.993874" elapsed="0.000409"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:41.994689" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:41.994437" elapsed="0.000278"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.027026" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:41.995272" elapsed="0.031931"/>
</kw>
<msg time="2026-04-07T17:21:42.027371" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:42.027418" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.994870" elapsed="0.032583"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.074065" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:42.028040" elapsed="0.046214"/>
</kw>
<msg time="2026-04-07T17:21:42.074424" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:42.074469" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.027621" elapsed="0.046883"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.074800" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.074582" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.074562" elapsed="0.000338"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.075430" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.075060" elapsed="0.000448"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.075783" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.075574" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.075556" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:42.075913" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.078216" elapsed="0.000507"/>
</kw>
<kw name="Open 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-07T17:21:42.079651" elapsed="0.000495"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:42.081055" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.076747" elapsed="0.004772"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:42.076181" elapsed="0.005454"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:41.993217" elapsed="0.088533"/>
</kw>
<msg time="2026-04-07T17:21:42.081841" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.081884" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.992596" elapsed="0.089324"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:42.082124" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.082016" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.081997" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.082580" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.082901" elapsed="0.000060"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.083027" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:41.991928" elapsed="0.091208"/>
</kw>
<msg time="2026-04-07T17:21:42.083226" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.083270" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.987227" elapsed="0.096077"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.083621" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.083378" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.083361" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:41.987091" elapsed="0.096633"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.088928" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.088819" elapsed="0.000349"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.088798" elapsed="0.000396"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.090391" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.090285" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.090267" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.090951" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.090597" elapsed="0.000397"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.091402" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:42.091148" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.120613" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:42.091964" elapsed="0.028823"/>
</kw>
<msg time="2026-04-07T17:21:42.120954" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:42.121021" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.091582" elapsed="0.029475"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.164807" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:42.121607" elapsed="0.043407"/>
</kw>
<msg time="2026-04-07T17:21:42.165183" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:42.165227" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.121224" elapsed="0.044038"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.165556" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.165339" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.165319" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.166212" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "S "t "a "r "t "[C "O "l "d "[C "C "a "n "d "i "d "a "t "e "[78C[C "[A[78CI
 "n "s "t "a "n "c "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.165822" elapsed="0.000468"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.166563" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.166355" elapsed="0.000282"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.166338" elapsed="0.000323"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:42.166694" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.168961" elapsed="0.000519"/>
</kw>
<kw name="Open 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-07T17:21:42.170469" elapsed="0.000468"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:42.171852" elapsed="0.000340"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.167521" elapsed="0.004741"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:42.166941" elapsed="0.005434"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:42.089983" elapsed="0.082491"/>
</kw>
<msg time="2026-04-07T17:21:42.172566" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.172610" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.089343" elapsed="0.083302"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:42.172828" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.172721" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.172703" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.173304" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.173642" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.173715" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:42.088479" elapsed="0.085345"/>
</kw>
<msg time="2026-04-07T17:21:42.173919" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.173962" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.084015" elapsed="0.090015"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.174350" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.174107" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.174090" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:42.083843" elapsed="0.090608"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:41.895708" elapsed="0.278771"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:41.893394" elapsed="0.281136"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:41.888843" elapsed="0.285740"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:41.888430" elapsed="0.286198"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:41.885685" elapsed="0.288992"/>
</kw>
<kw name="Start_Single_Member" owner="ClusterManagement">
<msg time="2026-04-07T17:21:42.179222" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Convenience keyword that starts the specified member of the cluster.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.174894" elapsed="0.004367">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Start Owner Instance and verify it is active</doc>
<status status="FAIL" start="2026-04-07T17:21:41.885245" elapsed="0.294150">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t24" name="Check Shards Status After Recover" 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-07T17:21:42.182558" elapsed="0.000207"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:42.182305" 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-07T17:21:42.183786" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.183680" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.183662" elapsed="0.000190"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.188443" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.188339" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.188321" elapsed="0.000188"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.189527" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.189152" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.190068" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:42.189733" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:42.190138" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:42.190289" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:42.188764" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.195474" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.195367" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.195349" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.196724" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.196620" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.196603" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.197315" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.196927" elapsed="0.000414"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.197764" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:42.197494" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.227218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:42.198343" elapsed="0.029040"/>
</kw>
<msg time="2026-04-07T17:21:42.227555" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:42.227600" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.197945" elapsed="0.029690"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.279797" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:42.228221" elapsed="0.051785"/>
</kw>
<msg time="2026-04-07T17:21:42.280176" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:42.280221" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.227803" elapsed="0.052452"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.280548" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.280332" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.280313" elapsed="0.000334"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.281175" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.280782" elapsed="0.000472"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.281528" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.281319" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.281302" elapsed="0.000341"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:42.281675" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.283945" elapsed="0.000520"/>
</kw>
<kw name="Open 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-07T17:21:42.285394" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:42.286836" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.282502" elapsed="0.004740"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:42.281922" elapsed="0.005433"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:42.196322" elapsed="0.091132"/>
</kw>
<msg time="2026-04-07T17:21:42.287545" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.287588" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.195689" elapsed="0.091934"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:42.287805" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.287699" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.287680" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.288280" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.288603" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.288674" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:42.195035" elapsed="0.093744"/>
</kw>
<msg time="2026-04-07T17:21:42.288870" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.288913" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.190662" elapsed="0.098286"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.289296" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.289053" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.289036" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:42.190528" elapsed="0.098868"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.294728" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.294622" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.294604" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.295986" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.295863" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.295845" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.296543" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.296193" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.297078" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:42.296719" elapsed="0.000387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.327069" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:42.297655" elapsed="0.029573"/>
</kw>
<msg time="2026-04-07T17:21:42.327396" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:42.327441" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.297262" elapsed="0.030213"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.386367" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:42.328051" elapsed="0.058501"/>
</kw>
<msg time="2026-04-07T17:21:42.386718" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:42.386802" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.327640" elapsed="0.059199"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.387155" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.386916" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.386896" elapsed="0.000362"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.387762" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.387394" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.388142" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.387912" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.387893" elapsed="0.000349"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:42.388275" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.390553" elapsed="0.000522"/>
</kw>
<kw name="Open 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-07T17:21:42.391960" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:42.393324" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.389112" elapsed="0.004613"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:42.388526" elapsed="0.005310"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:42.295565" elapsed="0.098369"/>
</kw>
<msg time="2026-04-07T17:21:42.394056" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.394100" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.294942" elapsed="0.099193"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:42.394316" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.394212" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.394193" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.394769" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.395108" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.395178" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:42.294285" elapsed="0.100999"/>
</kw>
<msg time="2026-04-07T17:21:42.395375" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.395418" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.289678" elapsed="0.105774"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.395765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.395526" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.395509" elapsed="0.000332"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:42.289514" elapsed="0.106349"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.401115" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.401008" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.400989" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.402408" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.402303" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.402286" elapsed="0.000225"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.403161" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.402651" elapsed="0.000539"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.403599" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:42.403345" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.432495" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:42.404181" elapsed="0.028562"/>
</kw>
<msg time="2026-04-07T17:21:42.432947" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:42.433018" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.403779" elapsed="0.029275"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:42.490998" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:42.433710" elapsed="0.057477"/>
</kw>
<msg time="2026-04-07T17:21:42.491358" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:42.491403" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.433248" elapsed="0.058190"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.491735" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.491516" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.491496" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.492377" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "S "h "a "r "d "s "[C "S "t "a "t "u "s "[78C[C "[A[78CA
 "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.491996" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.492731" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.492522" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.492504" elapsed="0.000327"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:42.492864" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.495203" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:21:42.496604" elapsed="0.000476"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:42.497984" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.493730" elapsed="0.004639"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:42.493139" elapsed="0.005340"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:42.401955" elapsed="0.096625"/>
</kw>
<msg time="2026-04-07T17:21:42.498670" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.498713" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.401327" elapsed="0.097422"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:42.498934" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.498828" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.498806" elapsed="0.000248"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.499432" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.499818" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.499889" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:42.400654" elapsed="0.099357"/>
</kw>
<msg time="2026-04-07T17:21:42.500104" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:42.500147" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.396132" elapsed="0.104049"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.500497" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.500255" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.500238" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:42.395996" elapsed="0.104602"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:42.190364" elapsed="0.310262"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:42.187960" elapsed="0.312719"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:42.183398" elapsed="0.317335"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:42.182988" elapsed="0.317789"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:42.180253" elapsed="0.320581"/>
</kw>
<kw name="Check Ovsdb Shards Status After Cluster Event" owner="ClusterOvsdb">
<kw name="Wait Until Keyword Succeeds" owner="BuiltIn">
<kw name="Check Ovsdb Shards Status" owner="ClusterOvsdb">
<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-07T17:21:42.521654" elapsed="0.000235"/>
</kw>
<msg time="2026-04-07T17:21:42.521936" 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-07T17:21:42.521033" elapsed="0.000967"/>
</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 [['topology', 'default'], 'entity-ownership'] {} and return its value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.520572" elapsed="0.001505"/>
</kw>
<msg time="2026-04-07T17:21:42.522122" 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-07T17:21:42.512646" elapsed="0.009519"/>
</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-07T17:21:42.512264" elapsed="0.009973"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.522650" level="INFO">['topology', 'default']</msg>
<arg>${SHARD_OPER_LIST}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.522402" elapsed="0.000291"/>
</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-07T17:21:42.527587" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.527212" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.528081" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:42.527766" elapsed="0.000340"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:42.528151" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:42.528303" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:42.526826" 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-07T17:21:42.528475" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.529123" 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-07T17:21:42.528781" elapsed="0.000368"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.529599" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:42.529301" elapsed="0.000324"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.530186" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:42.529768" elapsed="0.000444"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.534264" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.533645" elapsed="0.000670"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:42.534374" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:42.534697" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.532293" elapsed="0.002462"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.581497" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.581100" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.582396" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.582031" elapsed="0.000449">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.582576" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.581686" elapsed="0.000915"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.583171" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.582761" elapsed="0.000436"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.583495" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:42.583671" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:42.583356" elapsed="0.000341"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.584112" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.583849" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.585104" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.584827" elapsed="0.000321"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.585582" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.585302" elapsed="0.000306"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.585914" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.586133" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.586302" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:42.585784" elapsed="0.000574"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.585653" elapsed="0.000734"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:42.586428" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:42.586582" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:42.584509" elapsed="0.002098"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.584223" elapsed="0.002415"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.586803" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.586662" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.584204" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.587469" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.587034" elapsed="0.000462"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.587596" elapsed="0.000031"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:42.580484" elapsed="0.007241"/>
</kw>
<msg time="2026-04-07T17:21:42.587778" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.568820" elapsed="0.019008"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.599259" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.610459" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.621869" 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-07T17:21:42.622072" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.622242" 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-07T17:21:42.622599" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.622460" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:42.622445" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.622810" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.622983" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.623146" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:42.622417" elapsed="0.000781"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.622317" elapsed="0.000906"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.623362" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.623435" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:42.623549" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:42.564910" elapsed="0.058664"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.624780" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.624545" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.624990" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.624216" elapsed="0.000800"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.625329" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.625088" elapsed="0.000298"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.625892" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.625596" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.625409" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.625069" elapsed="0.000921"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.628146" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.626138" elapsed="0.002034"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:42.628222" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:42.628373" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:42.623885" elapsed="0.004512"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.629596" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.629345" elapsed="0.000313">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.629750" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.629019" elapsed="0.000755"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:42.629993" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.629844" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.629825" elapsed="0.000252"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.630216" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.630382" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.630447" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:21:42.632192" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:42.628688" elapsed="0.003530"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.633589" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.633329" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.634039" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.633779" elapsed="0.000303"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:42.649133" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:42.650111" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:42.651031" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:42.636180" elapsed="0.014916"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.634147" elapsed="0.017043"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.651581" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.651248" elapsed="0.000475"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.634129" elapsed="0.017641"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.659131" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.654120" elapsed="0.005292"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.653610" elapsed="0.005851"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.653567" elapsed="0.005929"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.662839" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.659883" elapsed="0.003022"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.659574" elapsed="0.003378"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.659550" elapsed="0.003456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.663763" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.663222" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.664241" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.663898" elapsed="0.000424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.665001" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.664568" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.664355" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.663872" elapsed="0.001247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.665850" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.665331" elapsed="0.000556"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.666324" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.666008" elapsed="0.000396"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.667079" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.666649" elapsed="0.000466"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.666437" elapsed="0.000727"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.665958" elapsed="0.001236"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.667389" elapsed="0.000470"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:42.668497" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.668102" elapsed="0.000430"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.668740" elapsed="0.002531"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:42.652620" elapsed="0.018714"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.671507" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.671404" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.671385" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:42.677160" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:42.671714" elapsed="0.005476"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:42.677241" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:42.677413" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:42.632516" elapsed="0.044924"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.677502" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:42.677675" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:42.543810" elapsed="0.133914"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.678219" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.677895" elapsed="0.000448"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.677843" elapsed="0.000544"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.678475" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:42.538948" elapsed="0.139765"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.534963" elapsed="0.143826"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.534943" elapsed="0.143902"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.679905" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.679707" elapsed="0.000295"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:42.680233" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.680039" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.679648" elapsed="0.000727"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.681284" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:21:42.681496" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:42.679121" elapsed="0.002435"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.682825" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.681864" elapsed="0.001021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.684511" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.683207" elapsed="0.001367"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.692885" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.692632" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.693541" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.693270" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:42.702880" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:42.702938" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:42 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":300,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:21:41.024","LastApplied":754,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":754,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.129","active":true,"matchIndex":754,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":755},{"timeSinceLastActivity":"00:00:00.129","active":true,"matchIndex":754,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":755}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"854.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":198,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":76,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582502,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:42.703073" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:42.695607" elapsed="0.007492"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.693703" elapsed="0.009440"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.703318" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.703169" elapsed="0.000243"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.693682" elapsed="0.009755"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.706701" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":300,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:21:41.024","LastApplied":754,"PeerAddresses":"member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.343","LastLogIndex":754,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.129","active":true,"matchIndex":754,"voting":true,"id":"member-2-shard-topology-operational","nextIndex":755},{"timeSinceLastActivity":"00:00:00.129","active":true,"matchIndex":754,"voting":true,"id":"member-3-shard-topology-operational","nextIndex":755}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"854.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":198,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":76,"ShardName":"member-1-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582502,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.704498" elapsed="0.002265"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.704283" elapsed="0.002516"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.704265" elapsed="0.002559"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.709219" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.707116" elapsed="0.002147"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.706885" elapsed="0.002413"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.706866" elapsed="0.002456"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.709876" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.709505" elapsed="0.000398"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.710386" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.710034" elapsed="0.000434"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.711152" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.710714" elapsed="0.000475"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.710501" elapsed="0.000738"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.709965" elapsed="0.001304"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.712003" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.711482" elapsed="0.000560"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.712455" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.712139" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.713209" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.712781" elapsed="0.000463"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.712568" elapsed="0.000725"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.712114" elapsed="0.001208"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.713538" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:42.714636" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.714262" elapsed="0.000410"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.714885" elapsed="0.003004"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:42.703844" elapsed="0.014152"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.718322" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.718171" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.718142" elapsed="0.000273"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:42.722405" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:42.718677" elapsed="0.003756"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:42.722568" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:21:42.722920" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:42.686692" elapsed="0.036293"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.723060" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:21:42.723385" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:42.684923" elapsed="0.038522"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.725606" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.724778" elapsed="0.000880"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:42.725721" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:42.726101" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:42.723872" elapsed="0.002291"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.726815" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 754, 'CommittedTransactionsCount': 198, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True,...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.726453" elapsed="0.000423"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.727605" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.727219" elapsed="0.000445"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:42.727886" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:42.728057" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:42.531394" elapsed="0.196688"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:42.728139" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:42.728282" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:42.530623" elapsed="0.197682"/>
</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-07T17:21:42.728590" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.728381" elapsed="0.000264"/>
</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="PASS" start="2026-04-07T17:21:42.728869" elapsed="0.000302"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.728669" elapsed="0.000541"/>
</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-07T17:21:42.729389" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.729235" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.728364" elapsed="0.001100"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:42.530458" elapsed="0.199029"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.733708" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.733076" elapsed="0.000683"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:42.733819" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:42.734159" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.731649" elapsed="0.002569"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.780790" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.780413" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.781604" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.781387" elapsed="0.000281">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.781761" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.781028" elapsed="0.000757"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.782347" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.781950" elapsed="0.000423"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.782662" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:42.782795" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:42.782529" elapsed="0.000291"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.783232" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.782988" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.784361" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.784105" elapsed="0.000300"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.784824" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.784561" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.785175" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.785392" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.785558" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:42.785047" elapsed="0.000567"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.784898" elapsed="0.000746"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:42.785686" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:42.785845" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:42.783769" elapsed="0.002103"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.783343" elapsed="0.002561"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.786084" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.785928" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.783323" elapsed="0.002839"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.786718" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.786297" elapsed="0.000448"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.786791" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:42.779798" elapsed="0.007116"/>
</kw>
<msg time="2026-04-07T17:21:42.786964" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.768305" elapsed="0.018731"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.798488" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.809946" elapsed="0.000039"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.821655" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.821847" 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-07T17:21:42.822033" 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-07T17:21:42.822396" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.822258" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:42.822244" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.822605" 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-07T17:21:42.822766" 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-07T17:21:42.822925" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:42.822216" elapsed="0.000774"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.822115" elapsed="0.000901"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.823154" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.823228" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:42.823343" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:42.764377" elapsed="0.058992"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.824588" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.824344" elapsed="0.000308">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.824741" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.824013" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.825098" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.824836" elapsed="0.000321"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.825640" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.825349" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.825180" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.824818" elapsed="0.000904"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.828032" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.825865" elapsed="0.002194"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:42.828109" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:42.828259" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:42.823683" elapsed="0.004600"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.829533" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.829275" elapsed="0.000319">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.829684" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.828930" elapsed="0.000778"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:42.829917" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.829778" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.829759" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.830158" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.830323" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.830387" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:42.832133" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:42.828613" elapsed="0.003546"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.833526" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.833265" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.833957" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.833716" elapsed="0.000299"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:42.853044" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:42.853603" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:42.853905" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:42.835998" elapsed="0.017944"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.834083" elapsed="0.019937"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.854264" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.854058" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.834064" elapsed="0.020319"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.859255" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.855753" elapsed="0.003786"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.855455" elapsed="0.004134"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.855429" elapsed="0.004195"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.863184" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.860028" elapsed="0.003220"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.859702" elapsed="0.003594"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.859678" elapsed="0.003653"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.864081" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.863548" elapsed="0.000570"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.864533" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.864215" elapsed="0.000708"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.865659" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.865206" elapsed="0.000488"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.864960" elapsed="0.000784"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.864190" elapsed="0.001584"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.866386" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.866022" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.866707" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.866481" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.867251" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.866944" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.866788" elapsed="0.000524"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.866463" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.867475" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:42.868264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.867991" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.868437" elapsed="0.002106"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:42.854851" elapsed="0.015754"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.870777" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.870674" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.870655" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:42.876371" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:42.871002" elapsed="0.005399"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:42.876453" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:42.876608" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:42.832450" elapsed="0.044184"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.876695" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:42.876874" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:42.743322" elapsed="0.133601"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.877482" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.877114" elapsed="0.000492"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.877064" elapsed="0.000586"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.877737" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:42.738440" elapsed="0.139552"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.734424" elapsed="0.143647"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.734404" elapsed="0.143724"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.879180" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.878965" elapsed="0.000296"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:42.879487" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:21:42.879296" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.878906" elapsed="0.000723"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.880544" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:21:42.880729" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:42.878381" elapsed="0.002407"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.882061" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.881104" elapsed="0.001019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.883708" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.882413" elapsed="0.001358"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.891038" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.890773" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.891527" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.891281" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:42.902461" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:42.902541" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:42 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:42 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":754,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":754,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"393.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582502,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:42.902684" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:42.893582" elapsed="0.009137"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.891686" elapsed="0.011093"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.903057" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.902815" elapsed="0.000334"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.891666" elapsed="0.011513"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.907741" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":754,"PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-3-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-topology-operational","LastLogIndex":754,"LastLeadershipChangeTime":"2026-04-07 17:13:00.345","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"393.3 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-3-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582502,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.904706" elapsed="0.003118"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.904349" elapsed="0.003524"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.904323" elapsed="0.003585"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.913961" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.908727" elapsed="0.005380"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.908241" elapsed="0.005953"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.908191" elapsed="0.006065"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.915571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.914637" elapsed="0.000999"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.916393" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.915806" elapsed="0.000729"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.917762" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.916961" elapsed="0.000864"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.916592" elapsed="0.001319"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.915763" elapsed="0.002200"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.918839" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.918370" elapsed="0.000496"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.919179" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.918936" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.919704" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.919412" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.919261" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.918918" elapsed="0.000870"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.919931" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:42.920718" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.920448" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.920898" elapsed="0.002129"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:42.903731" elapsed="0.019359"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.923322" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:42.923214" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.923193" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:42.926210" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:42.923579" elapsed="0.002660"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:42.926342" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:42.926692" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:42.885892" elapsed="0.040881"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.926849" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:21:42.927197" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:42.884143" elapsed="0.043113"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.929421" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.928585" elapsed="0.000888"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:42.929538" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:42.929891" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:42.927687" elapsed="0.002266"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.930620" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 754, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.930263" elapsed="0.000418"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:42.931415" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.931026" elapsed="0.000449"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:42.931699" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:42.931855" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:42.730758" elapsed="0.201122"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:42.931939" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:42.932103" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:42.730000" elapsed="0.202128"/>
</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="PASS" start="2026-04-07T17:21:42.932420" elapsed="0.000224"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.932207" elapsed="0.000476"/>
</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-07T17:21:42.932850" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.932708" 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-07T17:21:42.933083" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.932929" elapsed="0.000207"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.932190" elapsed="0.000968"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:42.729818" elapsed="0.203366"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.937462" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.936820" elapsed="0.000692"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:42.937572" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:42.937901" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:42.935473" elapsed="0.002487"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.984614" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:42.984234" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.985378" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:42.985143" elapsed="0.000300">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:42.985573" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:42.984799" elapsed="0.000799"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.986162" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:42.985760" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:42.986480" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:42.986610" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:42.986344" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.987047" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.986787" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.988184" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:42.987911" elapsed="0.000317"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.988646" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:42.988385" elapsed="0.000287"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.988996" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.989199" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.989379" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:42.988852" elapsed="0.000585"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:42.988719" elapsed="0.000747"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:42.989509" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:42.989666" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:42.987586" elapsed="0.002105"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.987161" elapsed="0.002562"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:42.989893" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:42.989748" elapsed="0.000201"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.987142" elapsed="0.002847"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:42.990557" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:42.990130" elapsed="0.000454"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:42.990633" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:42.983614" elapsed="0.007141"/>
</kw>
<msg time="2026-04-07T17:21:42.990808" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:42.971899" elapsed="0.018960"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.002243" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.013636" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.024903" 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-07T17:21:43.025105" 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-07T17:21:43.025285" 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-07T17:21:43.025640" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.025502" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:43.025487" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.025852" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.026030" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.026193" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.025458" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.025359" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.026412" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.026487" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:43.026601" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:42.967773" elapsed="0.058853"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.027852" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.027617" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.028022" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.027284" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.028360" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.028119" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.028888" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.028595" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.028440" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.028100" elapsed="0.000884"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.031297" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.029131" elapsed="0.002192"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:43.031374" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.031524" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.026936" elapsed="0.004612"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.032723" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.032493" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.032912" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.032167" elapsed="0.000769"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:43.033158" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.033024" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.033004" elapsed="0.000257"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.033403" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.033568" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.033632" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:43.035370" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.031838" elapsed="0.003558"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.036745" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.036500" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.037192" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.036936" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.056904" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.057337" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:43.057596" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.039207" elapsed="0.018457"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.037313" elapsed="0.020457"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.058220" elapsed="0.000054"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.057832" elapsed="0.000544"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.037294" elapsed="0.021134"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.066503" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.060825" elapsed="0.005880"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.060311" elapsed="0.006431"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.060266" elapsed="0.006501"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.069158" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.067058" elapsed="0.002156"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.066824" elapsed="0.002425"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.066806" elapsed="0.002468"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.069798" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.069428" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.070139" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.069894" elapsed="0.000304"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.070714" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.070418" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.070259" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.069876" elapsed="0.000922"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.071324" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.070949" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.071644" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.071419" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.072184" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.071875" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.071724" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.071401" elapsed="0.000865"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.072408" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.073189" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.072901" elapsed="0.000325"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.073375" elapsed="0.002178"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.059271" elapsed="0.016344"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.075787" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.075684" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.075665" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.081598" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.076012" elapsed="0.005615"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.081678" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.081834" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.035689" elapsed="0.046171"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.081922" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:43.082110" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:42.947184" elapsed="0.134976"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.082624" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.082326" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.082275" elapsed="0.000530"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.082892" elapsed="0.000062"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:42.942244" elapsed="0.140914"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:42.938259" elapsed="0.144975"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:42.938240" elapsed="0.145051"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.084355" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.084152" elapsed="0.000284"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:43.084665" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.084472" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.084093" elapsed="0.000716"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.085774" elapsed="0.000057"/>
</kw>
<msg time="2026-04-07T17:21:43.085961" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:43.083543" elapsed="0.002495"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.087290" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.086344" elapsed="0.001007"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.089144" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.087646" elapsed="0.001575"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.096509" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.096258" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.097013" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.096751" elapsed="0.000306"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.106505" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.106563" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Follower","LastApplied":754,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":754,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"304.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582503,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:43.106665" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.099083" elapsed="0.007607"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.097174" elapsed="0.009558"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.106996" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.106758" elapsed="0.000343"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.097153" elapsed="0.009979"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.111689" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":753,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":753,"Leader":"member-1-shard-topology-operational","LastIndex":754,"RaftState":"Follower","LastApplied":754,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":754,"LastLeadershipChangeTime":"2026-04-07 17:13:00.343","PeerAddresses":"member-1-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-topology-operational, member-2-shard-topology-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-topology-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"304.6 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-operational: true, member-2-shard-topology-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":754,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":209871},"timestamp":1775582503,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.108649" elapsed="0.003121"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.108304" elapsed="0.003514"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.108279" elapsed="0.003574"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.115205" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.112255" elapsed="0.003011"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.111932" elapsed="0.003382"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.111908" elapsed="0.003440"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.116104" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.115567" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.116558" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.116240" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.117358" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.116885" elapsed="0.000509"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.116671" elapsed="0.000773"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.116214" elapsed="0.001260"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.118169" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.117687" elapsed="0.000508"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.118490" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.118265" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.119121" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.118803" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.118570" elapsed="0.000612"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.118247" elapsed="0.000957"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.119347" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.120142" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.119849" elapsed="0.000319"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.120316" elapsed="0.002114"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.107681" elapsed="0.014810"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.122718" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.122613" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.122592" elapsed="0.000193"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.125612" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.122998" elapsed="0.002643"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.125743" elapsed="0.000052"/>
</return>
<msg time="2026-04-07T17:21:43.126109" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.091352" elapsed="0.034842"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.126270" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:21:43.126599" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.089575" elapsed="0.037085"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.128812" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.128023" elapsed="0.000842"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:43.128928" elapsed="0.000082"/>
</return>
<msg time="2026-04-07T17:21:43.129332" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 17755825...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:43.127106" elapsed="0.002288"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.130066" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 754, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.129689" elapsed="0.000441"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.130854" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.130461" elapsed="0.000453"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:43.131156" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:43.131312" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:42.934567" elapsed="0.196769"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:43.131393" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:43.131538" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:42.933695" elapsed="0.197868"/>
</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="PASS" start="2026-04-07T17:21:43.131850" elapsed="0.000241"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.131640" elapsed="0.000489"/>
</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-07T17:21:43.132294" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.132154" 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-07T17:21:43.132505" elapsed="0.000173"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.132371" elapsed="0.000342"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.131623" elapsed="0.001114"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:42.933526" elapsed="0.199238"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:42.530260" elapsed="0.602533"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.132837" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.133147" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:43.133205" level="INFO">${follower_list} = [2, 3]</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-07T17:21:42.526123" elapsed="0.607105"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.133673" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:43.133748" level="INFO">${leader_count} = 1</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-07T17:21:43.133402" elapsed="0.000370"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.134068" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.133842" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.133823" elapsed="0.000324"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.136032" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:43.134280" elapsed="0.001798"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:43.136463" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.136275" elapsed="0.000213"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.136536" elapsed="0.000027"/>
</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="PASS" start="2026-04-07T17:21:42.523645" elapsed="0.613043"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:21:42.523427" elapsed="0.613307"/>
</iter>
<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-07T17:21:43.141292" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.140796" elapsed="0.000524"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.141829" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.141501" elapsed="0.000355"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:43.141900" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.142081" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.140406" elapsed="0.001700"/>
</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-07T17:21:43.142257" elapsed="0.000156"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.142938" 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-07T17:21:43.142576" elapsed="0.000389"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.143395" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.143139" elapsed="0.000285"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.143813" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.143573" elapsed="0.000266"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.147917" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.147316" elapsed="0.000666"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:43.148044" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:43.148365" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:43.145962" elapsed="0.002461"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.196097" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.195700" elapsed="0.000425"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.196842" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.196611" elapsed="0.000297">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.197019" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.196282" elapsed="0.000763"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.197618" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.197234" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.197933" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:43.198082" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:43.197798" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.198537" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.198292" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.199539" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.199288" elapsed="0.000295"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.200014" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.199738" elapsed="0.000302"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.200343" elapsed="0.000021"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.200541" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.200706" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.200216" elapsed="0.000547"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.200086" elapsed="0.000707"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:43.200835" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.201007" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:43.198937" elapsed="0.002096"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.198648" elapsed="0.002418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.201243" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.201090" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.198629" elapsed="0.002691"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.201873" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.201455" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.201945" elapsed="0.000044"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.195098" elapsed="0.006988"/>
</kw>
<msg time="2026-04-07T17:21:43.202137" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.183201" elapsed="0.018987"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.213807" elapsed="0.000027"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${epilog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.epilog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.225249" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.236565" 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-07T17:21:43.236753" 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-07T17:21:43.236923" 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-07T17:21:43.237305" elapsed="0.000053"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.237165" elapsed="0.000232"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:43.237150" elapsed="0.000271"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.237557" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.237720" 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-07T17:21:43.237886" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.237111" elapsed="0.000829"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.237011" elapsed="0.000953"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.238121" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.238197" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:43.238311" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:43.179174" elapsed="0.059162"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.239546" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.239311" elapsed="0.000298">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.239701" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.238961" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.240057" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.239797" elapsed="0.000318"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.240585" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.240296" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.240138" elapsed="0.000507"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.239777" elapsed="0.000890"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.242828" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.240811" elapsed="0.002043"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:43.242905" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.243071" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.238644" elapsed="0.004453"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.244286" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.244051" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.244439" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.243706" elapsed="0.000757"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:43.244667" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.244533" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.244515" elapsed="0.000232"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.244886" elapsed="0.000023"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.245067" elapsed="0.000023"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.245158" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:21:43.247055" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.243389" elapsed="0.003692"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.248473" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.248227" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.248910" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.248666" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.260928" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.261542" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:43.261838" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.250930" elapsed="0.010955"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.249035" elapsed="0.012921"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.262230" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.262022" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.249016" elapsed="0.013332"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.267224" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.263721" elapsed="0.003781"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.263422" elapsed="0.004130"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.263395" elapsed="0.004192"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.270699" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.267990" elapsed="0.002753"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.267664" elapsed="0.003114"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.267641" elapsed="0.003161"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.271346" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.270961" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.271671" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.271443" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.272221" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.271906" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.271753" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.271424" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.272820" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.272459" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.273170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.272916" elapsed="0.000311"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.273695" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.273404" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.273251" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.272897" elapsed="0.000880"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.273919" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.274701" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.274433" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.274879" elapsed="0.002118"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.262812" elapsed="0.014248"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.277244" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.277139" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.277120" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.282852" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.277450" elapsed="0.005432"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.282933" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.283129" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.247415" elapsed="0.035742"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.283219" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.283392" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.158598" elapsed="0.124845"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.283912" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.283609" elapsed="0.000454"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.283559" elapsed="0.000550"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.284199" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:43.153651" elapsed="0.130789"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.148630" elapsed="0.135887"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.148610" elapsed="0.135964"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.285656" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.285455" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:43.285991" elapsed="0.000062"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.285773" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.285394" elapsed="0.000747"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.287149" elapsed="0.000058"/>
</kw>
<msg time="2026-04-07T17:21:43.287339" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:43.284830" elapsed="0.002569"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.288645" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.287704" elapsed="0.001003"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.290548" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.289031" elapsed="0.001580"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.297998" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.297733" elapsed="0.000313"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.298591" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.298246" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.307300" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.307359" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":38,"SnapshotIndex":191,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":191,"Leader":"member-1-shard-default-operational","LastIndex":193,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":192,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":193,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.209","active":true,"matchIndex":192,"voting":true,"id":"member-3-shard-default-operational","nextIndex":193},{"timeSinceLastActivity":"00:00:00.208","active":true,"matchIndex":192,"voting":true,"id":"member-2-shard-default-operational","nextIndex":193}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"470.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":192,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":58,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55591},"timestamp":1775582503,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:43.307474" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.300656" elapsed="0.006844"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.298756" elapsed="0.008786"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.307717" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.307568" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.298736" elapsed="0.009096"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.311106" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":38,"SnapshotIndex":191,"InMemoryJournalLogSize":2,"ReplicatedToAllIndex":191,"Leader":"member-1-shard-default-operational","LastIndex":193,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:02.114","LastApplied":192,"PeerAddresses":"member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","LastLeadershipChangeTime":"2026-04-07 17:13:00.328","LastLogIndex":193,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.209","active":true,"matchIndex":192,"voting":true,"id":"member-3-shard-default-operational","nextIndex":193},{"timeSinceLastActivity":"00:00:00.208","active":true,"matchIndex":192,"voting":true,"id":"member-2-shard-default-operational","nextIndex":193}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"470.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":1,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":192,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":58,"ShardName":"member-1-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55591},"timestamp":1775582503,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.308910" elapsed="0.002257"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.308691" elapsed="0.002511"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.308672" elapsed="0.002555"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.313643" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.311497" elapsed="0.002191"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.311283" elapsed="0.002439"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.311266" elapsed="0.002480"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.314526" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.314001" elapsed="0.000562"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.315011" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.314663" elapsed="0.000471"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.315813" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.315390" elapsed="0.000459"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.315170" elapsed="0.000729"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.314637" elapsed="0.001292"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.316670" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.316166" elapsed="0.000540"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.317181" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.316804" elapsed="0.000460"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.317997" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.317521" elapsed="0.000522"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.317297" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.316778" elapsed="0.001344"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.318323" elapsed="0.000500"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.319453" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.319074" elapsed="0.000415"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.319696" elapsed="0.003200"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.308270" elapsed="0.014758"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.323363" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.323213" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.323184" elapsed="0.000271"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.327241" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.323716" elapsed="0.003554"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.327425" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:21:43.327781" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.292957" elapsed="0.034875"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.327910" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:21:43.328256" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.290978" elapsed="0.037338"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.330628" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.329806" elapsed="0.000874"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:43.330743" elapsed="0.000065"/>
</return>
<msg time="2026-04-07T17:21:43.331158" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:43.328748" elapsed="0.002473"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.331879" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 192, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 1, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.331513" elapsed="0.000428"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.332677" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.332288" elapsed="0.000448"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:43.332962" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:43.333165" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:43.145066" elapsed="0.188124"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:43.333247" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:43.333389" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:43.144290" elapsed="0.189122"/>
</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-07T17:21:43.333698" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.333489" elapsed="0.000266"/>
</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="PASS" start="2026-04-07T17:21:43.334063" elapsed="0.000225"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.333779" elapsed="0.000546"/>
</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-07T17:21:43.334490" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.334350" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.333472" elapsed="0.001093"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:43.144121" elapsed="0.190467"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.338629" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.337936" elapsed="0.000743"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:43.338739" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:43.339080" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:43.336563" elapsed="0.002576"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.385318" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.384907" elapsed="0.000439"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.386101" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.385873" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.386256" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.385543" elapsed="0.000738"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.386846" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.386438" elapsed="0.000435"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.387176" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:43.387330" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:43.387041" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.387748" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.387507" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.388755" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.388504" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.389251" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.388949" elapsed="0.000328"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.389578" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.389774" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.389940" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.389453" elapsed="0.000562"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.389323" elapsed="0.000721"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:43.390086" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:43.390241" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:43.388190" elapsed="0.002076"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.387873" elapsed="0.002424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.390461" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.390320" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.387850" elapsed="0.002687"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.391114" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.390672" elapsed="0.000469"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.391187" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.384304" elapsed="0.007003"/>
</kw>
<msg time="2026-04-07T17:21:43.391358" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.372818" elapsed="0.018591"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.403180" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.414599" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.426020" elapsed="0.000036"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.426225" 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-07T17:21:43.426395" 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-07T17:21:43.426753" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.426617" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:43.426603" elapsed="0.000230"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.426979" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.427144" 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-07T17:21:43.427303" elapsed="0.000020"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.426574" elapsed="0.000781"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.426469" elapsed="0.000911"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.427516" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.427590" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:21:43.427702" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:43.368931" elapsed="0.058796"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.428959" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.428714" elapsed="0.000335">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.429141" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.428369" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.429472" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.429235" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.430012" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.429707" elapsed="0.000332"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.429553" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.429216" elapsed="0.000879"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.432247" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.430239" elapsed="0.002035"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:43.432323" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.432472" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.428052" elapsed="0.004443"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.433829" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.433512" elapsed="0.000381">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.434004" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.433184" elapsed="0.000846"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:43.434235" elapsed="0.000024"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.434101" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.434082" elapsed="0.000233"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.434455" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.434617" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.434682" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:43.436552" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.432838" elapsed="0.003741"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.437942" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.437698" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.438387" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.438149" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.454231" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.455134" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:43.455582" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.440506" elapsed="0.015135"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.438497" elapsed="0.017238"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.456148" elapsed="0.000052"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.455792" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.438478" elapsed="0.017863"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.464177" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.458572" elapsed="0.006051"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.458096" elapsed="0.006605"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.458052" elapsed="0.006705"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.467823" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.465435" elapsed="0.002433"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.464879" elapsed="0.003022"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.464841" elapsed="0.003085"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.468460" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.468094" elapsed="0.000392"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.468783" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.468555" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.469339" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.469043" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.468864" elapsed="0.000536"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.468537" elapsed="0.000885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.469931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.469576" elapsed="0.000380"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.470270" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.470043" elapsed="0.000283"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.470791" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.470502" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.470350" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.470025" elapsed="0.000847"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.471031" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.471797" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.471530" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.471982" elapsed="0.002131"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.457143" elapsed="0.017032"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.474345" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.474243" elapsed="0.000147"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.474225" elapsed="0.000187"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.480082" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.474551" elapsed="0.005561"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.480164" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.480318" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.436871" elapsed="0.043473"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.480404" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.480575" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.348504" elapsed="0.132121"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.481116" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.480789" elapsed="0.000455"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.480740" elapsed="0.000549"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.481374" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:43.343519" elapsed="0.138091"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.339348" elapsed="0.142338"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.339329" elapsed="0.142413"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.482790" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.482593" elapsed="0.000282"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:43.483122" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.482911" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.482534" elapsed="0.000731"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.484176" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:21:43.484360" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:43.482010" elapsed="0.002409"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.485669" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.484719" elapsed="0.001011"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.487369" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.486057" elapsed="0.001375"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.494658" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.494410" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.495172" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.494906" elapsed="0.000308"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.502719" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.502775" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":191,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":191,"Leader":"member-1-shard-default-operational","LastIndex":192,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":192,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":192,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"309.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":192,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55550},"timestamp":1775582503,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:43.502876" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.497225" elapsed="0.005675"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.495330" elapsed="0.007612"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.503133" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.502985" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.495310" elapsed="0.007907"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.507026" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":191,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":191,"Leader":"member-1-shard-default-operational","LastIndex":192,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":192,"PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-3-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-operational\/member-3-shard-default-operational","LastLogIndex":192,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"309.8 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-3-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":192,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55550},"timestamp":1775582503,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.504319" elapsed="0.002791"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.504066" elapsed="0.003094"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.504048" elapsed="0.003145"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.510649" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.507569" elapsed="0.003143"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.507271" elapsed="0.003489"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.507247" elapsed="0.003546"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.511539" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.511028" elapsed="0.000548"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.512017" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.511674" elapsed="0.000425"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.512757" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.512344" elapsed="0.000449"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.512132" elapsed="0.000711"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.511649" elapsed="0.001223"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.513691" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.513134" elapsed="0.000593"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.514160" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.513825" elapsed="0.000416"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.514889" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.514484" elapsed="0.000440"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.514274" elapsed="0.000720"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.513800" elapsed="0.001226"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.515225" elapsed="0.000475"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.516319" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.515920" elapsed="0.000434"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.516561" elapsed="0.002709"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.503614" elapsed="0.015718"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.519561" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.519456" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.519435" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.522414" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.519816" elapsed="0.002627"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.522545" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:43.522895" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.489544" elapsed="0.033401"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.523066" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:43.523398" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.487779" elapsed="0.035680"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.525608" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.524789" elapsed="0.000873"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:43.525725" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:43.526102" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:43.523892" elapsed="0.002272"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.526815" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 192, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.526455" elapsed="0.000428"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.527623" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.527232" elapsed="0.000451"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:43.527931" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:21:43.528115" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:43.335666" elapsed="0.192473"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:43.528195" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.528340" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:43.334902" elapsed="0.193461"/>
</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="PASS" start="2026-04-07T17:21:43.528649" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.528441" elapsed="0.000469"/>
</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-07T17:21:43.529115" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.528935" elapsed="0.000238"/>
</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-07T17:21:43.529331" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.529197" elapsed="0.000185"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.528424" elapsed="0.000980"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:43.334742" elapsed="0.194686"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.533490" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.532847" elapsed="0.000695"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:43.533602" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:43.533930" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:43.531495" elapsed="0.002580"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.580459" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.580083" elapsed="0.000403"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.581200" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.580990" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.581393" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.580642" elapsed="0.000776"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.581956" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.581575" elapsed="0.000422"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.582286" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:43.582420" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:43.582153" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.582835" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.582595" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.583813" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.583561" elapsed="0.000299"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.584296" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.584035" elapsed="0.000286"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.584624" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.584822" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.585028" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.584499" elapsed="0.000588"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.584368" elapsed="0.000748"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:43.585158" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.585314" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:43.583242" elapsed="0.002097"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.582946" elapsed="0.002424"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.585536" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.585395" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.582927" elapsed="0.002685"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.586183" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.585747" elapsed="0.000463"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.586258" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.579469" elapsed="0.006910"/>
</kw>
<msg time="2026-04-07T17:21:43.586430" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.567921" elapsed="0.018560"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.598029" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.609483" elapsed="0.000029"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${item_template}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${base_name}.item.${extension}</arg>
<arg>mapping=${mapping}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.620891" 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-07T17:21:43.621122" 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-07T17:21:43.621292" 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-07T17:21:43.621643" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.621505" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:43.621490" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.621853" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.622030" elapsed="0.000022"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.622193" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.621463" elapsed="0.000783"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.621366" elapsed="0.000905"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.622410" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.622484" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:43.622598" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:43.564043" elapsed="0.058580"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.624015" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.623592" elapsed="0.000487">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.624170" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.623262" elapsed="0.000932"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.624503" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.624265" elapsed="0.000294"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.625052" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.624737" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.624583" elapsed="0.000531"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.624246" elapsed="0.000889"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.627290" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.625278" elapsed="0.002038"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:43.627367" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.627518" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.622930" elapsed="0.004612"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.628714" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.628484" elapsed="0.000291">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.628907" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.628157" elapsed="0.000785"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:43.629166" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.629030" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.629010" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.629389" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.629553" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.629619" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:43.632403" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.627830" elapsed="0.004599"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.633801" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.633554" elapsed="0.000297"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.634254" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.634014" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.651814" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.652743" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:43.653260" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.636282" elapsed="0.017038"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.634364" elapsed="0.019050"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.653799" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.653471" elapsed="0.000470"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.634346" elapsed="0.019672"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.661841" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.656218" elapsed="0.005838"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.655714" elapsed="0.006378"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.655673" elapsed="0.006443"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.664480" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.662389" elapsed="0.002136"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.662172" elapsed="0.002387"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.662155" elapsed="0.002429"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.665144" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.664738" elapsed="0.000434"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.665470" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.665241" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.666017" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.665705" elapsed="0.000339"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.665551" elapsed="0.000528"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.665223" elapsed="0.000878"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.666611" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.666254" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.666930" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.666706" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.667475" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.667182" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.667028" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.666688" elapsed="0.000869"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.667701" elapsed="0.000356"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.668485" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.668215" elapsed="0.000296"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.668658" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.654760" elapsed="0.016072"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.671021" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.670901" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.670882" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.676569" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.671226" elapsed="0.005373"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.676651" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.676807" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.632723" elapsed="0.044111"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.676911" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.677098" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.543456" elapsed="0.133692"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.677607" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.677312" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.677263" elapsed="0.000510"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.677859" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:43.538468" elapsed="0.139652"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.534288" elapsed="0.143908"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.534268" elapsed="0.143985"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.679311" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.679113" elapsed="0.000278"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="PASS" start="2026-04-07T17:21:43.679619" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.679427" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.679054" elapsed="0.000708"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.680670" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:21:43.680858" level="INFO">${type_class} = DistributedOperationalDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:43.678505" elapsed="0.002426"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.682167" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.681249" elapsed="0.000978"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.683826" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.682516" elapsed="0.001372"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.691215" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.690821" elapsed="0.000439"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.691703" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.691459" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.699654" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.699711" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":195,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":195,"Leader":"member-1-shard-default-operational","LastIndex":196,"RaftState":"Follower","LastApplied":196,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":196,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"259.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":196,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55714},"timestamp":1775582503,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:43.699823" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.693750" elapsed="0.006101"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.691861" elapsed="0.008035"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.700088" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.699921" elapsed="0.000232"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.691841" elapsed="0.008334"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.703447" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":195,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":195,"Leader":"member-1-shard-default-operational","LastIndex":196,"RaftState":"Follower","LastApplied":196,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":196,"LastLeadershipChangeTime":"2026-04-07 17:13:00.331","PeerAddresses":"member-1-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-operational\/member-1-shard-default-operational, member-2-shard-default-operational: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-operational\/member-2-shard-default-operational","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"259.8 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-operational","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-operational: true, member-2-shard-default-operational: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":196,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-operational","LeadershipChangeCount":1,"InMemoryJournalDataSize":55714},"timestamp":1775582503,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.701276" elapsed="0.002230"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.701023" elapsed="0.002517"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.701003" elapsed="0.002562"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.706041" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.703833" elapsed="0.002271"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.703620" elapsed="0.002531"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.703603" elapsed="0.002582"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.706911" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.706400" elapsed="0.000547"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.707385" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.707068" elapsed="0.000397"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.708153" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.707710" elapsed="0.000479"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.707497" elapsed="0.000741"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.707042" elapsed="0.001226"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.709017" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.708480" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.709612" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.709151" elapsed="0.000546"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.710387" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.709949" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.709730" elapsed="0.000742"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.709126" elapsed="0.001375"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.710702" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.711798" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.711425" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.712062" elapsed="0.002646"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.700576" elapsed="0.014193"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.715024" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.714893" elapsed="0.000178"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.714872" elapsed="0.000221"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.717873" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.715282" elapsed="0.002620"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.718019" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:43.718366" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.686212" elapsed="0.032204"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.718531" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:43.719003" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp"...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.684252" elapsed="0.034814"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.721219" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.720401" elapsed="0.000872"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:43.721336" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:43.721692" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-operational,type=DistributedOperationalDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 177558250...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:43.719498" elapsed="0.002256"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.722421" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 196, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.722060" elapsed="0.000423"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.723220" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.722813" elapsed="0.000466"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:43.723505" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:43.723659" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:43.530604" elapsed="0.193079"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:43.723738" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.723881" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:43.529742" elapsed="0.194163"/>
</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="PASS" start="2026-04-07T17:21:43.724214" elapsed="0.000405"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.724004" elapsed="0.000654"/>
</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-07T17:21:43.724825" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.724683" elapsed="0.000230"/>
</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-07T17:21:43.725103" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.724939" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.723964" elapsed="0.001215"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:43.529581" elapsed="0.195622"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.143885" elapsed="0.581347"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.725271" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:43.725466" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:43.725511" level="INFO">${follower_list} = [2, 3]</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-07T17:21:43.139640" elapsed="0.585894"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.725962" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:43.726160" level="INFO">${leader_count} = 1</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-07T17:21:43.725699" elapsed="0.000485"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.726462" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.726253" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.726234" elapsed="0.000305"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.728414" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:43.726666" elapsed="0.001794"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:43.728856" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.728669" elapsed="0.000228"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.728945" elapsed="0.000043"/>
</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="PASS" start="2026-04-07T17:21:43.137121" elapsed="0.592107"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:21:43.136817" elapsed="0.592459"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:21:42.523302" elapsed="1.206004"/>
</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="PASS" start="2026-04-07T17:21:42.522907" elapsed="1.206451"/>
</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-07T17:21:43.734346" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.733952" elapsed="0.000421"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.734828" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.734528" elapsed="0.000327"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:43.734902" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.735070" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.733590" 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-07T17:21:43.735242" elapsed="0.000151"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.735873" 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-07T17:21:43.735547" elapsed="0.000352"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.736301" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.736066" elapsed="0.000260"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.736702" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:43.736469" elapsed="0.000259"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.740836" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.740231" elapsed="0.000673"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:43.740979" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:43.741308" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:43.738822" elapsed="0.002545"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.787951" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.787575" elapsed="0.000419"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.788691" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.788480" elapsed="0.000274">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.788855" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.788154" elapsed="0.000726"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.789437" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.789055" elapsed="0.000408"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.789752" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:43.789915" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:43.789618" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.790359" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.790116" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.791344" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.791091" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.791801" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.791542" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.792151" elapsed="0.000023"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.792352" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.792519" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.792023" elapsed="0.000552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.791876" elapsed="0.000729"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:43.792646" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.792802" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:43.790755" elapsed="0.002071"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.790471" elapsed="0.002399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.793052" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.792895" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.790451" elapsed="0.002678"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.793685" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.793265" elapsed="0.000447"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.793759" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.786961" elapsed="0.006919"/>
</kw>
<msg time="2026-04-07T17:21:43.793931" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.775456" elapsed="0.018541"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.805635" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.817128" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.828544" 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-07T17:21:43.828775" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.828957" elapsed="0.000037"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.829490" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.829204" elapsed="0.000346"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:43.829188" elapsed="0.000386"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.829710" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.829878" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.830059" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.829148" elapsed="0.000966"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.829048" elapsed="0.001091"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.830278" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.830352" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:43.830467" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:43.771521" elapsed="0.058971"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.831711" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.831466" elapsed="0.000308">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.831864" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.831134" 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-07T17:21:43.832217" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.831960" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.832741" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.832453" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.832298" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.831941" elapsed="0.000882"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.835020" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.833010" elapsed="0.002037"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:43.835098" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:43.835250" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.830802" elapsed="0.004472"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.836477" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.836236" elapsed="0.000302">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.836628" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.835879" elapsed="0.000772"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:43.836868" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.836721" elapsed="0.000205"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.836702" elapsed="0.000247"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.837107" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.837318" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.837384" elapsed="0.000022"/>
</return>
<msg time="2026-04-07T17:21:43.839733" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:43.835565" elapsed="0.004197"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.841536" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.841259" elapsed="0.000327"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.842235" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.841901" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.852496" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.852953" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:43.853272" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.844651" elapsed="0.008659"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.842365" elapsed="0.011004"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.853613" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.853406" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.842339" elapsed="0.011392"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.858623" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.855146" elapsed="0.003763"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.854820" elapsed="0.004138"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.854790" elapsed="0.004248"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.862241" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.859423" elapsed="0.002863"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.859120" elapsed="0.003200"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.859096" elapsed="0.003249"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.862873" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.862499" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.863216" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.862984" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.863744" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.863449" elapsed="0.000320"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.863297" elapsed="0.000508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.862951" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.864356" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.863997" elapsed="0.000385"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.864676" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.864452" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.865228" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.864920" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.864756" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.864433" elapsed="0.000878"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.865455" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.866250" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.865960" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.866423" elapsed="0.002125"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.854231" elapsed="0.014378"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.868783" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.868679" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.868660" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.874444" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.869020" elapsed="0.005453"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.874525" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:43.874682" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.840276" elapsed="0.034432"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.874769" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:43.874943" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.750808" elapsed="0.124204"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.875471" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.875177" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.875129" elapsed="0.000511"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.875727" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:43.745734" elapsed="0.130247"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.741578" elapsed="0.134483"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.741557" elapsed="0.134560"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:43.877192" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:21:43.876992" elapsed="0.000308"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.877438" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.877337" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.876916" elapsed="0.000634"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.878463" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:21:43.878648" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:43.876375" elapsed="0.002332"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.879939" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.879024" elapsed="0.000996"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.881795" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.880313" elapsed="0.001550"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.888948" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.888685" elapsed="0.000323"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.889448" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.889206" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:43.897313" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:43.897369" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:43 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:43 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":26,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":135,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":135,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.283","active":true,"matchIndex":135,"voting":true,"id":"member-2-shard-topology-config","nextIndex":136},{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":135,"voting":true,"id":"member-3-shard-topology-config","nextIndex":136}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"445.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":42,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582503,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:43.897482" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:43.891489" elapsed="0.006019"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.889608" elapsed="0.007942"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.897722" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.897576" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.889588" elapsed="0.008220"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.901091" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":26,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.385","LastApplied":135,"PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.290","LastLogIndex":135,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.283","active":true,"matchIndex":135,"voting":true,"id":"member-2-shard-topology-config","nextIndex":136},{"timeSinceLastActivity":"00:00:00.284","active":true,"matchIndex":135,"voting":true,"id":"member-3-shard-topology-config","nextIndex":136}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"445.9 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":1,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":42,"ShardName":"member-1-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582503,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.898892" elapsed="0.002260"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.898678" elapsed="0.002508"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.898659" elapsed="0.002552"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.903584" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.901480" elapsed="0.002148"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.901267" elapsed="0.002395"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.901250" elapsed="0.002435"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.904225" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.903837" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.904549" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.904322" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.905121" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.904780" elapsed="0.000367"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.904630" elapsed="0.000553"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.904304" elapsed="0.000900"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.905713" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.905355" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.906149" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.905807" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.906881" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.906472" elapsed="0.000445"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.906262" elapsed="0.000722"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.905789" elapsed="0.001227"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.907216" elapsed="0.000474"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:43.908314" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.907918" elapsed="0.000432"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.908622" elapsed="0.003156"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:43.898258" elapsed="0.013608"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.912223" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:43.912070" elapsed="0.000217"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.912039" elapsed="0.000278"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:43.916412" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:43.912582" elapsed="0.003870"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:43.916596" elapsed="0.000075"/>
</return>
<msg time="2026-04-07T17:21:43.917195" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:43.884115" elapsed="0.033152"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.917370" elapsed="0.000085"/>
</return>
<msg time="2026-04-07T17:21:43.917829" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.882228" elapsed="0.035662"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.920199" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582503, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.919266" elapsed="0.000988"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:43.920319" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:43.920680" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582503, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:43.918338" elapsed="0.002404"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.921436" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 135, 'CommittedTransactionsCount': 1, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [{'active': True, '...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.921071" elapsed="0.000427"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:43.922232" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.921827" elapsed="0.000464"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:43.922516" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:43.922672" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:43.737921" elapsed="0.184775"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:43.922752" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:43.922916" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:43.737172" elapsed="0.185773"/>
</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-07T17:21:43.923277" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.923065" 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="PASS" start="2026-04-07T17:21:43.923557" elapsed="0.000223"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.923357" elapsed="0.000461"/>
</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-07T17:21:43.924042" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.923842" elapsed="0.000255"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.923047" elapsed="0.001073"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:43.737009" elapsed="0.187135"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.928212" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.927485" elapsed="0.000777"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:43.928322" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:43.928648" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:43.926120" elapsed="0.002586"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.975450" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:43.975070" elapsed="0.000408"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.976238" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:43.976019" elapsed="0.000284">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:43.976396" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:43.975636" elapsed="0.000784"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.976999" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:43.976578" elapsed="0.000448"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:43.977319" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:43.977450" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:43.977182" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.977872" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.977625" 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-07T17:21:43.978856" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:43.978597" elapsed="0.000314"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.979373" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:43.979112" elapsed="0.000288"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.979702" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.979899" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.980178" elapsed="0.000025"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:43.979575" elapsed="0.000664"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:43.979445" elapsed="0.000823"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:43.980310" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:43.980466" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:43.978282" elapsed="0.002208"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.977996" elapsed="0.002525"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.980686" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:43.980545" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.977962" elapsed="0.002811"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:43.981359" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:43.980914" elapsed="0.000473"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:43.981434" elapsed="0.000027"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:43.974409" elapsed="0.007145"/>
</kw>
<msg time="2026-04-07T17:21:43.981606" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:43.962784" elapsed="0.018873"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:43.993090" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.004425" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.015829" 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-07T17:21:44.016030" elapsed="0.000024"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.016203" 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-07T17:21:44.016556" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.016419" elapsed="0.000193"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:44.016404" elapsed="0.000232"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.016782" elapsed="0.000023"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.016948" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.017135" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.016376" elapsed="0.000813"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.016277" elapsed="0.000938"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.017353" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.017427" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:44.017540" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:43.958872" elapsed="0.058693"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.018770" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.018537" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.018948" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.018207" elapsed="0.000789"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.019316" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.019075" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.019836" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.019549" elapsed="0.000315"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.019396" elapsed="0.000504"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.019056" elapsed="0.000865"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.022442" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.020080" elapsed="0.002397"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:44.022533" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:44.022693" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.017875" elapsed="0.004842"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.024096" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.023752" elapsed="0.000409">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.024253" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.023407" elapsed="0.000870"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:44.024482" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.024347" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.024328" elapsed="0.000236"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.024705" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.024888" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.024954" elapsed="0.000120"/>
</return>
<msg time="2026-04-07T17:21:44.026941" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.023032" elapsed="0.003949"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.028340" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.028094" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.028781" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.028533" elapsed="0.000291"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.044143" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.045066" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:44.045517" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.030888" elapsed="0.014688"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.028890" elapsed="0.016779"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.046096" elapsed="0.000051"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.045726" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.028872" elapsed="0.017414"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.054130" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.048520" elapsed="0.005893"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.048042" elapsed="0.006420"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.047997" elapsed="0.006500"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.057837" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.054876" elapsed="0.003029"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.054574" elapsed="0.003379"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.054550" elapsed="0.003457"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.058735" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.058221" elapsed="0.000551"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.059210" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.058868" elapsed="0.000423"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.059952" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.059536" elapsed="0.000471"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.059324" elapsed="0.000733"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.058843" elapsed="0.001244"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.060963" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.060300" elapsed="0.000724"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.061442" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.061124" elapsed="0.000398"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.062105" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.061767" elapsed="0.000363"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.061555" elapsed="0.000610"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.061098" elapsed="0.001089"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.062328" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.063113" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.062822" elapsed="0.000316"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.063285" elapsed="0.002130"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.047055" elapsed="0.018422"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.065648" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.065545" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.065526" elapsed="0.000188"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.071363" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.065852" elapsed="0.005541"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.071444" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.071600" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.027280" elapsed="0.044346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.071687" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:44.071856" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:43.938179" elapsed="0.133726"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.072387" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.072092" elapsed="0.000417"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.072043" elapsed="0.000510"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.072639" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:43.933217" elapsed="0.139707"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:43.928938" elapsed="0.144100"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:43.928918" elapsed="0.144185"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:44.074153" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.073939" elapsed="0.000320"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.074399" elapsed="0.000034"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.074297" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.073881" elapsed="0.000628"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.075461" elapsed="0.000055"/>
</kw>
<msg time="2026-04-07T17:21:44.075646" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:44.073356" elapsed="0.002350"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.076934" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.076020" elapsed="0.000995"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.078604" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.077318" elapsed="0.001347"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.085840" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.085592" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.086344" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.086100" elapsed="0.000288"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.094063" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.094143" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":135,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":135,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"286.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582504,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:44.094285" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.088515" elapsed="0.005805"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.086504" elapsed="0.007874"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.094617" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.094413" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.086484" elapsed="0.008251"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.100788" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":135,"PeerAddresses":"member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config, member-3-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-topology-config","LastLogIndex":135,"LastLeadershipChangeTime":"2026-04-07 17:13:00.298","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"286.2 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-topology-config: true, member-3-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582504,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.096242" elapsed="0.004673"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.095893" elapsed="0.005071"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.095864" elapsed="0.005162"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.104371" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.101409" elapsed="0.003025"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.101104" elapsed="0.003377"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.101080" elapsed="0.003436"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.105297" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.104760" elapsed="0.000574"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.105746" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.105432" elapsed="0.000395"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.106329" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.106032" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.105860" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.105406" elapsed="0.001006"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.106922" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.106562" elapsed="0.000386"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.107263" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.107036" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.107786" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.107495" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.107344" elapsed="0.000503"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.107017" elapsed="0.000854"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.108031" elapsed="0.000343"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.108811" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.108532" elapsed="0.000305"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.108999" elapsed="0.002111"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.095311" elapsed="0.015861"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.111399" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.111293" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.111272" elapsed="0.000194"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.114301" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.111652" elapsed="0.002677"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.114431" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:21:44.114782" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.080811" elapsed="0.034027"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.114992" elapsed="0.000073"/>
</return>
<msg time="2026-04-07T17:21:44.115335" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.079076" elapsed="0.036320"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.117562" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.116753" elapsed="0.000861"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:44.117678" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:44.118052" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:44.115826" elapsed="0.002289"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.118765" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 135, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.118407" elapsed="0.000420"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.119556" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.119170" elapsed="0.000444"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:44.119835" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.120003" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:43.925232" elapsed="0.194896"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:44.120187" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:44.120334" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:43.924461" elapsed="0.195897"/>
</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="PASS" start="2026-04-07T17:21:44.120644" elapsed="0.000237"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.120435" elapsed="0.000484"/>
</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-07T17:21:44.121102" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.120944" 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-07T17:21:44.121316" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.121180" elapsed="0.000187"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.120418" elapsed="0.000971"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:43.924299" elapsed="0.197113"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.125421" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.124800" elapsed="0.000672"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:44.125532" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:44.125857" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:44.123462" elapsed="0.002452"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.173079" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.172678" elapsed="0.000429"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.173801" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.173590" elapsed="0.000273">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.174006" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.173265" elapsed="0.000767"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.174574" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.174194" elapsed="0.000407"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.174889" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:44.175029" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:44.174756" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.175447" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.175206" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.176434" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.176180" elapsed="0.000297"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.176905" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.176631" elapsed="0.000300"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.177254" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.177453" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.177620" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.177126" elapsed="0.000552"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.176992" elapsed="0.000714"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:44.177748" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.177905" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:44.175842" elapsed="0.002088"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.175558" elapsed="0.002404"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.178150" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.178006" elapsed="0.000200"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.175539" elapsed="0.002688"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.178786" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.178364" elapsed="0.000449"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.178861" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.172054" elapsed="0.006960"/>
</kw>
<msg time="2026-04-07T17:21:44.179067" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.160351" elapsed="0.018769"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.190605" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.202004" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.213334" 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-07T17:21:44.213524" 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-07T17:21:44.213695" 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-07T17:21:44.214067" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.213914" elapsed="0.000209"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:44.213899" elapsed="0.000248"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.214280" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.214444" 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-07T17:21:44.214604" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.213868" elapsed="0.000789"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.213769" elapsed="0.000913"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.214821" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.214895" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:44.215025" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:44.156329" elapsed="0.058721"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.216255" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.216022" elapsed="0.000295">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.216407" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.215678" elapsed="0.000753"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.216754" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.216502" elapsed="0.000308"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.217293" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.217005" elapsed="0.000314"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.216834" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.216483" elapsed="0.000892"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.219529" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.217522" elapsed="0.002032"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:44.219605" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:44.219756" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.215360" elapsed="0.004420"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.221016" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.220751" elapsed="0.000327">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.221213" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.220401" elapsed="0.000837"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:44.221442" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.221309" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.221290" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.221664" elapsed="0.000021"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.221829" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.221894" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:44.223795" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.220085" elapsed="0.003735"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.225212" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.224949" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.225644" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.225405" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.238934" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.239503" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:44.239786" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.227710" elapsed="0.012113"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.225754" elapsed="0.014128"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.240148" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.239919" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.225735" elapsed="0.014535"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.245226" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.241667" elapsed="0.003956"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.241368" elapsed="0.004307"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.241340" elapsed="0.004371"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.249114" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.246128" elapsed="0.003031"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.245789" elapsed="0.003405"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.245765" elapsed="0.003454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.249742" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.249374" elapsed="0.000395"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.250085" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.249838" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.250617" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.250321" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.250168" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.249820" elapsed="0.000880"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.251281" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.250853" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.251609" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.251381" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.252161" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.251840" elapsed="0.000346"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.251688" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.251362" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.252386" elapsed="0.000351"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.253183" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.252896" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.253358" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.240759" elapsed="0.014773"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.255705" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.255601" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.255582" elapsed="0.000191"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.261437" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.255911" elapsed="0.005556"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.261518" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.261673" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.224133" elapsed="0.037566"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.261760" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:44.261932" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.135552" elapsed="0.126450"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.262467" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.262172" elapsed="0.000428"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.262122" elapsed="0.000523"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.262733" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:44.130376" elapsed="0.132613"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.126209" elapsed="0.136870"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.126189" elapsed="0.136949"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:44.264205" elapsed="0.000060"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.264002" elapsed="0.000312"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.264455" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.264352" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.263925" elapsed="0.000643"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.265507" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:21:44.265694" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:44.263394" elapsed="0.002359"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.267013" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.266074" elapsed="0.001002"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.268884" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.267371" elapsed="0.001576"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.276061" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.275796" elapsed="0.000310"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.276551" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.276307" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.283939" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.284011" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Follower","LastApplied":135,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":135,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"272.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582504,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:44.284115" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.278613" elapsed="0.005527"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.276723" elapsed="0.007458"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.284354" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.284207" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.276703" elapsed="0.007736"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.287818" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":134,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":134,"Leader":"member-1-shard-topology-config","LastIndex":135,"RaftState":"Follower","LastApplied":135,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":135,"LastLeadershipChangeTime":"2026-04-07 17:13:00.299","PeerAddresses":"member-2-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-topology-config, member-1-shard-topology-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-topology-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"272.3 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-topology-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-2-shard-topology-config: true, member-1-shard-topology-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":135,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-topology-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":5168},"timestamp":1775582504,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.285499" elapsed="0.002413"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.285287" elapsed="0.002660"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.285269" elapsed="0.002719"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.291021" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.288269" elapsed="0.002817"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.288048" elapsed="0.003086"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.288030" elapsed="0.003139"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.291900" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.291385" elapsed="0.000553"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.292399" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.292075" elapsed="0.000403"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.293238" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.292740" elapsed="0.000535"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.292511" elapsed="0.000813"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.292046" elapsed="0.001308"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.294092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.293568" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.294542" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.294227" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.295302" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.294869" elapsed="0.000469"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.294654" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.294201" elapsed="0.001216"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.295618" elapsed="0.000496"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.296723" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.296337" elapsed="0.000422"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.296964" elapsed="0.003057"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.284853" elapsed="0.015256"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.300429" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.300278" elapsed="0.000215"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.300249" elapsed="0.000275"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.303492" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.300818" elapsed="0.002702"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.303620" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:21:44.303979" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.271110" elapsed="0.032923"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.304138" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:44.304467" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 1775582...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.269313" elapsed="0.035213"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.306692" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.305855" elapsed="0.000893"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:44.306817" elapsed="0.000068"/>
</return>
<msg time="2026-04-07T17:21:44.307213" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-topology-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:44.304984" elapsed="0.002292"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.308038" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 135, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitia...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.307591" elapsed="0.000517"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.308882" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.308452" elapsed="0.000495"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:44.309290" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:44.309457" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:44.122576" elapsed="0.186907"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:44.309544" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:44.309698" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:44.121723" elapsed="0.188003"/>
</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="PASS" start="2026-04-07T17:21:44.310097" elapsed="0.000241"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.309809" elapsed="0.000569"/>
</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-07T17:21:44.310554" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.310405" elapsed="0.000206"/>
</branch>
<branch type="ELSE IF" condition="${validate}">
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized Raft state: ${raft_state}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.310783" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.310638" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.309789" elapsed="0.001073"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:44.121564" elapsed="0.189323"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.736772" elapsed="0.574145"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.310960" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:21:44.311196" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:44.311244" level="INFO">${follower_list} = [2, 3]</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-07T17:21:43.732854" elapsed="0.578415"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.311722" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:44.311798" level="INFO">${leader_count} = 1</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-07T17:21:44.311445" elapsed="0.000378"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.312133" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.311898" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.311877" elapsed="0.000336"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.314342" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:44.312345" elapsed="0.002043"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:44.314779" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.314591" elapsed="0.000214"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.314853" 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="PASS" start="2026-04-07T17:21:43.730422" elapsed="0.584606"/>
</kw>
<var name="${shard_name}">topology</var>
<status status="PASS" start="2026-04-07T17:21:43.730206" elapsed="0.584869"/>
</iter>
<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-07T17:21:44.319434" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.319050" elapsed="0.000412"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.319922" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:44.319616" elapsed="0.000332"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:44.320011" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.320169" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.318667" 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-07T17:21:44.320342" elapsed="0.000155"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.321037" 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-07T17:21:44.320668" elapsed="0.000398"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.321463" level="INFO">${leader_list} = []</msg>
<var>${leader_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:44.321221" elapsed="0.000267"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.321873" level="INFO">${follower_list} = []</msg>
<var>${follower_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:44.321631" elapsed="0.000271"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.325932" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.325326" elapsed="0.000672"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:44.326061" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:44.326386" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:44.323957" elapsed="0.002514"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.373126" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.372666" elapsed="0.000489"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.373860" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.373640" elapsed="0.000285">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.374036" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.373313" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.374596" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.374219" elapsed="0.000403"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.374913" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:44.375131" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:44.374776" elapsed="0.000381"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.375546" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.375306" elapsed="0.000328"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.376594" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.376329" elapsed="0.000309"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.377072" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.376793" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.377403" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.377599" elapsed="0.000025"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.377765" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.377276" elapsed="0.000546"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.377145" elapsed="0.000705"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:44.377892" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:44.378066" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:44.376010" elapsed="0.002081"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.375705" elapsed="0.002417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.378287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.378147" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.375686" elapsed="0.002676"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.378912" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.378497" elapsed="0.000442"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.379001" elapsed="0.000029"/>
</return>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.372049" elapsed="0.007075"/>
</kw>
<msg time="2026-04-07T17:21:44.379175" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.360637" elapsed="0.018587"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.391017" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.402361" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.413768" 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-07T17:21:44.413951" elapsed="0.000035"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.414134" 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-07T17:21:44.414483" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.414347" elapsed="0.000225"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:44.414333" elapsed="0.000265"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.414735" elapsed="0.000021"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.414896" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.415072" elapsed="0.000022"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.414305" elapsed="0.000822"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.414207" elapsed="0.000945"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.415289" elapsed="0.000021"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.415365" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:44.415479" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:44.356739" elapsed="0.058765"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.416720" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.416476" elapsed="0.000306">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.416871" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.416145" elapsed="0.000750"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.417221" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.416979" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.417739" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.417454" elapsed="0.000310"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.417301" elapsed="0.000498"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.416946" elapsed="0.000875"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.419964" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.417964" elapsed="0.002040"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:44.420055" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.420207" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.415811" elapsed="0.004420"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.421433" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.421203" elapsed="0.000292">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.421586" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.420855" elapsed="0.000755"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:44.421812" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.421679" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.421661" elapsed="0.000238"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.422055" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.422220" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.422284" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:44.424164" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.420518" elapsed="0.003673"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.425590" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.425346" elapsed="0.000289"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.426033" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.425779" elapsed="0.000298"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.435611" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.436023" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:44.436217" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.428017" elapsed="0.008227"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.426143" elapsed="0.010142"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.436459" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.436311" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.426124" elapsed="0.010437"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.440025" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.437546" elapsed="0.002689"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.437333" elapsed="0.002938"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.437313" elapsed="0.002983"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.443448" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.440604" elapsed="0.002907"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.440362" elapsed="0.003195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.440344" elapsed="0.003247"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.444341" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.443801" elapsed="0.000576"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.444810" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.444473" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.445753" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.445159" elapsed="0.000630"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.444923" elapsed="0.000916"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.444448" elapsed="0.001421"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.446614" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.446109" elapsed="0.000542"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.447085" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.446748" elapsed="0.000419"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.447818" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.447413" elapsed="0.000439"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.447200" elapsed="0.000701"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.446722" elapsed="0.001209"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.448150" elapsed="0.000491"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.449264" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.448862" elapsed="0.000438"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.449505" elapsed="0.003053"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.436899" elapsed="0.015748"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.452877" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.452743" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.452717" elapsed="0.000226"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.458637" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.453097" elapsed="0.005569"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.458718" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:44.458874" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.424521" elapsed="0.034379"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.458960" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:21:44.459148" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.335688" elapsed="0.123510"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.459661" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.459365" elapsed="0.000435"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.459315" elapsed="0.000533"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.459938" elapsed="0.000084"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:44.330759" elapsed="0.129444"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.326678" elapsed="0.133602"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.326659" elapsed="0.133678"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:44.461426" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.461226" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.461674" elapsed="0.000036"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.461571" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.461166" elapsed="0.000621"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.462731" elapsed="0.000057"/>
</kw>
<msg time="2026-04-07T17:21:44.462924" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:44.460610" elapsed="0.002389"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.464252" level="INFO">${cluster_index} = 1</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.463309" elapsed="0.001006"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.466093" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.464649" elapsed="0.001507"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.473447" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.473181" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.473931" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.473690" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.483590" level="INFO">GET Request : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.483650" level="INFO">GET Response : url=http://10.30.170.175:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.350","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.351","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"479.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:44.483754" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.476041" elapsed="0.007739"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.474120" elapsed="0.009701"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.484021" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.483851" elapsed="0.000236"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.474099" elapsed="0.010009"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.491024" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":14,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Leader","LastCommittedTransactionTime":"2026-04-07 17:13:01.134","LastApplied":45,"PeerAddresses":"member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","LastLeadershipChangeTime":"2026-04-07 17:13:00.338","LastLogIndex":45,"FollowerInitialSyncStatus":false,"FollowerInfo":[{"timeSinceLastActivity":"00:00:00.350","active":true,"matchIndex":45,"voting":true,"id":"member-3-shard-default-config","nextIndex":46},{"timeSinceLastActivity":"00:00:00.351","active":true,"matchIndex":45,"voting":true,"id":"member-2-shard-default-config","nextIndex":46}],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"479.1 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":2,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":7,"TxCohortCacheSize":0,"PeerVotingStates":"member-3-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":10,"ShardName":"member-1-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.485719" elapsed="0.005445"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.485243" elapsed="0.005999"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.485201" elapsed="0.006097"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.496699" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.491899" elapsed="0.004901"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.491422" elapsed="0.005457"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.491384" elapsed="0.005549"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.497565" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.497192" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.497895" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.497661" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.498442" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.498148" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.497992" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.497643" elapsed="0.000881"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.499106" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.498674" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.499429" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.499202" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.499951" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.499661" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.499510" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.499184" elapsed="0.000867"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.500194" elapsed="0.000352"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.501005" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.500711" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.501181" elapsed="0.002095"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.484577" elapsed="0.018761"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.503569" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.503462" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.503440" elapsed="0.000196"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.506528" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.503824" elapsed="0.002732"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.506657" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:44.507059" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.468412" elapsed="0.038699"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.507183" elapsed="0.000060"/>
</return>
<msg time="2026-04-07T17:21:44.507507" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.466509" elapsed="0.041058"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.509729" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.508903" elapsed="0.000878"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:44.509843" elapsed="0.000066"/>
</return>
<msg time="2026-04-07T17:21:44.510221" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-1-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:44.508009" elapsed="0.002273"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.510951" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 7, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 2, 'FollowerInfo': [{'active': True, 'i...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.510573" elapsed="0.000474"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.511759" level="INFO">${raft_property} = Leader</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.511375" elapsed="0.000442"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:44.512052" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:44.512208" level="INFO">${raft_state} = Leader</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:44.323089" elapsed="0.189143"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:44.512289" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:44.512431" level="INFO">${raft_state} = Leader</msg>
<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="PASS" start="2026-04-07T17:21:44.322327" elapsed="0.190128"/>
</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-07T17:21:44.512757" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.512547" elapsed="0.000267"/>
</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="PASS" start="2026-04-07T17:21:44.513054" elapsed="0.000227"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.512837" elapsed="0.000482"/>
</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-07T17:21:44.513484" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.513343" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.512529" elapsed="0.001030"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:44.322165" elapsed="0.191417"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.517666" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.517063" elapsed="0.000653"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:44.517774" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:44.518115" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:44.515652" elapsed="0.002521"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.566002" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.565604" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.566858" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.566628" elapsed="0.000301">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.567043" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.566190" elapsed="0.000878"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.567611" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.567227" elapsed="0.000410"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.567932" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:44.568086" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:44.567790" elapsed="0.000322"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.568533" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.568263" elapsed="0.000314"/>
</kw>
<if>
<branch type="IF" condition="${percent_encode} == True">
<kw name="Encode_Mapping" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.569512" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.569262" elapsed="0.000294"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.569986" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.569708" elapsed="0.000305"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.570326" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.570525" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.570692" elapsed="0.000021"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.570199" elapsed="0.000549"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.570063" elapsed="0.000715"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:44.570820" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:44.570996" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:44.568932" elapsed="0.002090"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.568646" elapsed="0.002407"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.571220" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.571078" elapsed="0.000196"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.568626" elapsed="0.002669"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.571852" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.571431" elapsed="0.000451"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.571931" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.564998" elapsed="0.007077"/>
</kw>
<msg time="2026-04-07T17:21:44.572128" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.553398" elapsed="0.018781"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.583916" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.595248" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.606599" 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-07T17:21:44.606787" 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-07T17:21:44.606955" elapsed="0.000034"/>
</kw>
<for flavor="IN RANGE">
<iter>
<if>
<branch type="IF" condition="${iteration} &gt; ${iter_start}">
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${separator}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.607322" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.607185" elapsed="0.000192"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:44.607170" elapsed="0.000231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.607535" 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-07T17:21:44.607700" 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-07T17:21:44.607861" elapsed="0.000024"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.607142" elapsed="0.000776"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.607044" elapsed="0.000900"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.608098" elapsed="0.000022"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.608174" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:44.608289" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:44.549229" elapsed="0.059085"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.609769" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.609527" elapsed="0.000305">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.609923" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.609184" elapsed="0.000764"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.610275" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.610036" elapsed="0.000295"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.610797" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.610509" elapsed="0.000313"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.610355" elapsed="0.000501"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.610016" elapsed="0.000861"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.613071" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.611036" elapsed="0.002061"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:44.613148" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:44.613299" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.608809" elapsed="0.004514"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.614548" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.614315" elapsed="0.000296">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.614703" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.613979" elapsed="0.000749"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:44.614932" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.614798" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.614780" elapsed="0.000250"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.615173" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.615338" elapsed="0.000021"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.615403" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:21:44.617322" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.613611" elapsed="0.003737"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.618704" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.618459" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.619160" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.618901" elapsed="0.000302"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.633120" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.633674" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:44.634007" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.621186" elapsed="0.012862"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.619270" elapsed="0.014837"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.634352" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.634143" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.619252" elapsed="0.015218"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.639371" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.635840" elapsed="0.003887"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.635543" elapsed="0.004237"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.635517" elapsed="0.004299"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.642596" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.640227" elapsed="0.002414"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.639895" elapsed="0.002780"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.639870" elapsed="0.002829"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.643241" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.642853" elapsed="0.000415"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.643567" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.643338" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.644116" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.643802" elapsed="0.000340"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.643648" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.643320" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.644727" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.644354" elapsed="0.000399"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.645066" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.644823" elapsed="0.000302"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.645593" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.645303" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.645149" elapsed="0.000505"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.644804" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.645821" elapsed="0.000364"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.646616" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.646344" elapsed="0.000298"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.646790" elapsed="0.002121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.634940" elapsed="0.014046"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.649160" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.649057" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.649038" elapsed="0.000189"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.654736" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.649366" elapsed="0.005400"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.654817" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.654986" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.617646" elapsed="0.037368"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.655076" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:44.655249" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.528693" elapsed="0.126606"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.655762" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.655465" elapsed="0.000434"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.655415" elapsed="0.000529"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.656056" elapsed="0.000182"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:44.523705" elapsed="0.132747"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.519704" elapsed="0.136826"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.518361" elapsed="0.138226"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:44.657653" elapsed="0.000059"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.657454" elapsed="0.000306"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.657899" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.657797" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.657395" elapsed="0.000637"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.658947" elapsed="0.000069"/>
</kw>
<msg time="2026-04-07T17:21:44.659147" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:44.656841" elapsed="0.002366"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.660459" level="INFO">${cluster_index} = 2</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.659511" elapsed="0.001011"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.662353" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.660819" elapsed="0.001596"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.669733" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.669485" elapsed="0.000293"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.670237" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.669994" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.678239" level="INFO">GET Request : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.678296" level="INFO">GET Response : url=http://10.30.171.205:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"251.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:44.678408" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.672304" elapsed="0.006130"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.670396" elapsed="0.008080"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.678652" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.678502" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.670376" elapsed="0.008361"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.681985" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastApplied":45,"PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-3-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.206:2550\/user\/shardmanager-config\/member-3-shard-default-config","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.340","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"Voting":true,"StatRetrievalTime":"251.5 μs","CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-3-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-2-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.679788" elapsed="0.002291"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.679572" elapsed="0.002543"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.679554" elapsed="0.002585"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.684555" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.682412" elapsed="0.002189"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.682194" elapsed="0.002446"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.682177" elapsed="0.002488"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.685379" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.684820" elapsed="0.000597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.685834" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.685515" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.686609" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.686193" elapsed="0.000452"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.685947" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.685489" elapsed="0.001236"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.687463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.686938" elapsed="0.000561"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.687912" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.687597" elapsed="0.000417"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.688823" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.688263" elapsed="0.000596"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.688048" elapsed="0.000861"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.687571" elapsed="0.001368"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.689165" elapsed="0.000481"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.690270" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.689869" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.690513" elapsed="0.003146"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.679155" elapsed="0.014592"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.694099" elapsed="0.000021"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.693919" elapsed="0.000244"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.693890" elapsed="0.000304"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.697834" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.694458" elapsed="0.003405"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.697965" elapsed="0.000070"/>
</return>
<msg time="2026-04-07T17:21:44.698335" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.664614" elapsed="0.033772"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.698458" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:44.698887" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.662769" elapsed="0.036179"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.701109" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.700305" elapsed="0.000856"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:44.701259" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:44.701616" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-2-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:44.699402" elapsed="0.002274"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.702338" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.701979" elapsed="0.000420"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.703140" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.702726" elapsed="0.000474"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:44.703421" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:44.703576" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:44.514758" elapsed="0.188842"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:44.703656" elapsed="0.000025"/>
</return>
<msg time="2026-04-07T17:21:44.703798" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:44.513902" elapsed="0.189920"/>
</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="PASS" start="2026-04-07T17:21:44.704124" elapsed="0.000222"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.703898" elapsed="0.000486"/>
</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-07T17:21:44.704561" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.704419" 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-07T17:21:44.704774" elapsed="0.000019"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.704638" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.703881" elapsed="0.000965"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:44.513740" elapsed="0.191129"/>
</iter>
<iter>
<kw name="Get_Raft_State_Of_Shard_At_Member" owner="ClusterManagement">
<kw name="Get_Raft_Property_From_Shard_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.709064" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.708436" elapsed="0.000679"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:21:44.709174" elapsed="0.000061"/>
</return>
<msg time="2026-04-07T17:21:44.709494" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:44.706843" elapsed="0.002710"/>
</kw>
<if>
<branch type="IF" condition="${verify_restconf}">
<kw name="Get_As_Json_Templated" owner="TemplatedRequests">
<kw name="Get_Templated" owner="TemplatedRequests">
<kw name="Resolve_Text_From_Template_Folder" owner="TemplatedRequests">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.755796" level="INFO">${file_path_stream} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/location.uri</msg>
<var>${file_path_stream}</var>
<arg>${folder}.${ODL_STREAM}${/}${file_name}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.755420" elapsed="0.000404"/>
</kw>
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.756566" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</msg>
<arg>${file_path_stream}</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.756323" elapsed="0.000307">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules.vanadium/location.uri' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.756721" level="INFO">${file_stream_exists} = False</msg>
<var>${file_stream_exists}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${file_path_stream}</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.755996" elapsed="0.000748"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.757306" level="INFO">${file_path} = /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/location.uri</msg>
<var>${file_path}</var>
<arg>${file_stream_exists}</arg>
<arg>${file_path_stream}</arg>
<arg>${folder}${/}${file_name}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.756904" elapsed="0.000429"/>
</kw>
<kw name="Get File" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.757620" level="INFO" html="true">Getting file '&lt;a href="file:///w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri"&gt;/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/location.uri&lt;/a&gt;'.</msg>
<msg time="2026-04-07T17:21:44.757820" level="INFO">${template} = /rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<var>${template}</var>
<arg>${file_path}</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="PASS" start="2026-04-07T17:21:44.757487" elapsed="0.000397"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.758308" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig
</msg>
<arg>${template}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.758060" 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-07T17:21:44.759290" level="INFO">mapping: {}</msg>
<arg>mapping: ${mapping}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.759035" elapsed="0.000298"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.759746" level="INFO">${encoded_mapping} = {}</msg>
<var>${encoded_mapping}</var>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.759487" elapsed="0.000285"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Convert To String" owner="BuiltIn">
<var>${value}</var>
<arg>${value}</arg>
<doc>Converts the given item to a Unicode string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.760098" elapsed="0.000022"/>
</kw>
<kw name="Percent_Encode_String" owner="TemplatedRequests">
<var>${encoded_value}</var>
<arg>${value}</arg>
<doc>Percent encodes reserved characters in the given string so it can be used as part of url.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.760296" elapsed="0.000024"/>
</kw>
<kw name="Set To Dictionary" owner="Collections">
<arg>${encoded_mapping}</arg>
<arg>${key}</arg>
<arg>${encoded_value}</arg>
<doc>Adds the given ``key_value_pairs`` and/or ``items`` to the ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.760470" elapsed="0.000022"/>
</kw>
<var name="${key}"/>
<var name="${value}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.759955" elapsed="0.000573"/>
</iter>
<var>${key}</var>
<var>${value}</var>
<value>&amp;{mapping}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.759819" elapsed="0.000737"/>
</for>
<return>
<value>${encoded_mapping}</value>
<status status="PASS" start="2026-04-07T17:21:44.760599" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:21:44.760753" level="INFO">${mapping_to_use} = {}</msg>
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<status status="PASS" start="2026-04-07T17:21:44.758704" elapsed="0.002074"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.758420" elapsed="0.002389"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<var>${mapping_to_use}</var>
<arg>${mapping}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.760988" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.760833" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.758401" elapsed="0.002665"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.761622" level="INFO">${final_text} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${final_text}</var>
<arg>string.Template('''${template}'''.rstrip()).safe_substitute(${mapping_to_use})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.761204" elapsed="0.000444"/>
</kw>
<return>
<value>${final_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.761696" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.754804" elapsed="0.007012"/>
</kw>
<msg time="2026-04-07T17:21:44.761867" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>not "${iterations}"</arg>
<arg>Resolve_Text_From_Template_File</arg>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.743236" elapsed="0.018682"/>
</kw>
<kw name="Resolve_Text_From_Template_File" owner="TemplatedRequests">
<var>${prolog}</var>
<arg>folder=${folder}</arg>
<arg>file_name=${name_prefix}${base_name}.prolog.${extension}</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=${percent_encode}</arg>
<doc>Check if /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.773629" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.784931" 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/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name} exists. If yes read and Log contents of file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules.vanadium/${file_name},
remove endline, perform safe substitution, return result.
If no do it with the default /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/${file_name}.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.797868" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${items}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.798096" elapsed="0.000023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${separator}</var>
<arg>'${extension}' != 'json'</arg>
<arg>${endline}</arg>
<arg>,${endline}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.798270" 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-07T17:21:44.798682" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.798541" elapsed="0.000197"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:21:44.798527" elapsed="0.000235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<var>${j}</var>
<arg>${iteration}+${iter_j_offset}</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.798916" elapsed="0.000025"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<var>${item}</var>
<arg>string.Template('''${item_template}''').substitute({"i":"${iteration}", "j":${j}})</arg>
<arg>modules=string</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.799127" elapsed="0.000021"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${items}</arg>
<arg>${item}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.799288" elapsed="0.000021"/>
</kw>
<var name="${iteration}"/>
<status status="NOT RUN" start="2026-04-07T17:21:44.798497" elapsed="0.000844"/>
</iter>
<var>${iteration}</var>
<value>${iter_start}</value>
<value>${iterations}+${iter_start}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.798386" elapsed="0.000981"/>
</for>
<kw name="Catenate" owner="BuiltIn">
<var>${final_text}</var>
<arg>SEPARATOR=</arg>
<arg>${prolog}</arg>
<arg>${endline}</arg>
<arg>@{items}</arg>
<arg>${endline}</arg>
<arg>${epilog}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.799505" elapsed="0.000020"/>
</kw>
<return>
<value>${final_text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.799580" elapsed="0.000016"/>
</return>
<msg time="2026-04-07T17:21:44.799703" level="INFO">${uri} = /rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<var>${uri}</var>
<arg>folder=${folder}</arg>
<arg>base_name=location</arg>
<arg>extension=uri</arg>
<arg>mapping=${mapping}</arg>
<arg>percent_encode=True</arg>
<doc>Read a template from folder, strip endline, make changes according to mapping, return the result.
If ${iterations} value is present, put text together from "prolog", "item" and "epilog" parts,
where additional template variable ${i} goes from ${iter_start}, by one ${iterations} times.
Template variable ${j} is calculated as ${i} incremented by offset ${iter_j_offset} ( j = i + iter_j_offset )
used to create non uniform data in order to be able to validate UPDATE operations.
POST (as opposed to PUT) needs slightly different data, ${name_prefix} may be used to distinguish.
(Actually, it is GET who formats data differently when URI is a top-level container.)</doc>
<status status="PASS" start="2026-04-07T17:21:44.739324" elapsed="0.060405"/>
</kw>
<kw name="Resolve_Jmes_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.801029" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</msg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.800754" elapsed="0.000341">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/jmespath.expr' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.801184" level="INFO">${read_jmes_file} = False</msg>
<var>${read_jmes_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.800409" elapsed="0.000799"/>
</kw>
<if>
<branch type="IF" condition="${read_jmes_file} == ${true}">
<kw name="Get File" owner="OperatingSystem">
<var>${jmes_expression}</var>
<arg>${folder}${/}jmespath.expr</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.801519" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.801279" elapsed="0.000296"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.802065" level="INFO">${jmes_expression} = None</msg>
<var>${jmes_expression}</var>
<arg>${None}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.801760" elapsed="0.000330"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.801599" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.801260" elapsed="0.000886"/>
</if>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.804293" level="INFO">${expression} = </msg>
<var>${expression}</var>
<arg>${read_jmes_file} == ${true}</arg>
<arg>${jmes_expression}</arg>
<arg>${EMPTY}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.802290" elapsed="0.002029"/>
</kw>
<return>
<value>${expression}</value>
<status status="PASS" start="2026-04-07T17:21:44.804391" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:44.804545" level="INFO">${jmes_expression} = </msg>
<var>${jmes_expression}</var>
<arg>${folder}</arg>
<doc>Reads JMES path from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/jmespath.expr if the file exists and
returns the JMES path. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.800073" elapsed="0.004497"/>
</kw>
<kw name="Resolve_Volatiles_Path" owner="TemplatedRequests">
<kw name="Run Keyword And Return Status" owner="BuiltIn">
<kw name="File Should Exist" owner="OperatingSystem">
<msg time="2026-04-07T17:21:44.805762" level="FAIL">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</msg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Fails unless the given ``path`` points to an existing file.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.805521" elapsed="0.000303">File '/w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/variables/restconf/modules/volatiles.list' does not exist.</status>
</kw>
<msg time="2026-04-07T17:21:44.805914" level="INFO">${read_volatiles_file} = False</msg>
<var>${read_volatiles_file}</var>
<arg>OperatingSystem.File Should Exist</arg>
<arg>${folder}${/}volatiles.list</arg>
<doc>Runs the specified keyword and returns the status as a Boolean value.</doc>
<status status="PASS" start="2026-04-07T17:21:44.805194" elapsed="0.000743"/>
</kw>
<if>
<branch type="IF" condition="${read_volatiles_file} == ${false}">
<return>
<value>${EMPTY}</value>
<status status="PASS" start="2026-04-07T17:21:44.806158" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.806024" elapsed="0.000192"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.806005" elapsed="0.000234"/>
</if>
<kw name="Get File" owner="OperatingSystem">
<var>${volatiles}</var>
<arg>${folder}${/}volatiles.list</arg>
<doc>Returns the contents of a specified file.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.806378" elapsed="0.000022"/>
</kw>
<kw name="Split String" owner="String">
<var>${volatiles_list}</var>
<arg>${volatiles}</arg>
<arg>${\n}</arg>
<doc>Splits the ``string`` using ``separator`` as a delimiter string.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.806544" elapsed="0.000020"/>
</kw>
<return>
<value>${volatiles_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.806608" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:21:44.808544" level="INFO">${volatiles_list} = </msg>
<var>${volatiles_list}</var>
<arg>${folder}</arg>
<doc>Reads Volatiles List from file /w/workspace/ovsdb-csit-3node-upstream-clustering-only-vanadium/test/csit/libraries/../variables/restconf/modules/volatiles.list if the file exists and
returns the Volatiles List. Empty string is returned otherwise.</doc>
<status status="PASS" start="2026-04-07T17:21:44.804862" elapsed="0.003708"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.809924" level="INFO">/rests/data/ietf-yang-library:modules-state?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.809675" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.810367" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.810129" elapsed="0.000280"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.823244" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 path_url=/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.823654" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/ietf-yang-library:modules-state?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Transfer-Encoding': 'chunked'} 
 body={"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-... (set the log level to DEBUG or TRACE to see the full content) 
 </msg>
<msg time="2026-04-07T17:21:44.823884" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.812440" elapsed="0.011502"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.810474" elapsed="0.013601"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.824482" elapsed="0.000048"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.824134" elapsed="0.000489"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.810456" elapsed="0.014214"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.832579" level="INFO">{"ietf-yang-library:modules-state":{"module":[{"name":"ovsdb_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/ovsdb?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:ovsdb","conformance-type":"import"},{"name":"nc-notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/nc-notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netmod:notification","conformance-type":"import"},{"name":"ietf-udp-server_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-server?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-server","conformance-type":"import"},{"name":"ietf-crypto-types_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-crypto-types?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-crypto-types","conformance-type":"import","feature":["one-asymmetric-key-format","hidden-private-keys","cleartext-passwords","one-symmetric-key-format","p10-csr-format","encrypted-symmetric-keys","cleartext-symmetric-keys","csr-generation","cms-enveloped-data-format","encrypted-passwords","hidden-symmetric-keys","encrypted-private-keys","asymmetrically-encrypted-value-format","cleartext-private-keys","cms-encrypted-data-format","symmetrically-encrypted-value-format","certificate-expiration-notification"]},{"name":"ietf-udp-client_2025-12-16","revision":"2025-12-16","schema":"/rests/modules/ietf-udp-client?revision=2025-12-16","namespace":"urn:ietf:params:xml:ns:yang:ietf-udp-client","conformance-type":"import","feature":["local-binding"]},{"name":"ietf-tls-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-common","conformance-type":"import","feature":["tls12","hello-params","tls13"]},{"name":"iana-http-versions_2026-02-04","revision":"2026-02-04","schema":"/rests/modules/iana-http-versions?revision=2026-02-04","namespace":"urn:ietf:params:xml:ns:yang:iana-http-versions","conformance-type":"import"},{"name":"ietf-http-client_2024-02-08","revision":"2024-02-08","schema":"/rests/modules/ietf-http-client?revision=2024-02-08","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-client","conformance-type":"import","feature":["basic-auth","tcp-supported","tls-supported"]},{"name":"distributed-datastore-provider_2025-01-30","revision":"2025-01-30","schema":"/rests/modules/distributed-datastore-provider?revision=2025-01-30","namespace":"urn:opendaylight:params:xml:ns:yang:controller:config:distributed-datastore-provider","conformance-type":"import"},{"name":"ietf-datastores_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-datastores?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-datastores","conformance-type":"import"},{"name":"odl-controller-cds-types_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/odl-controller-cds-types?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:cds:types","conformance-type":"import"},{"name":"aaa-app-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-app-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:app:config","conformance-type":"import"},{"name":"ietf-tls-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-server","conformance-type":"import","feature":["server-ident-x509-cert","client-auth-supported","client-auth-x509-cert"]},{"name":"ietf-restconf-server_2024-08-14","revision":"2024-08-14","schema":"/rests/modules/ietf-restconf-server?revision=2024-08-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-server","conformance-type":"import","feature":["http-listen","https-listen"]},{"name":"network-topology_2013-10-21","revision":"2013-10-21","schema":"/rests/modules/network-topology?revision=2013-10-21","namespace":"urn:TBD:params:xml:ns:yang:network-topology","conformance-type":"import"},{"name":"ietf-truststore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-truststore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-truststore","conformance-type":"import","feature":["inline-definitions-supported"]},{"name":"sal-remote_2014-01-14","revision":"2014-01-14","schema":"/rests/modules/sal-remote?revision=2014-01-14","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote","conformance-type":"import"},{"name":"aaa-encrypt-service-config_2024-02-02","revision":"2024-02-02","schema":"/rests/modules/aaa-encrypt-service-config?revision=2024-02-02","namespace":"config:aaa:authn:encrypt:service:config","conformance-type":"import"},{"name":"iana-ssh-encryption-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-encryption-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-encryption-algs","conformance-type":"import"},{"name":"ietf-tcp-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-server","conformance-type":"import","feature":["tcp-server-keepalives"]},{"name":"odl-entity-owners","revision":"","schema":"/rests/modules/odl-entity-owners","namespace":"urn:opendaylight:params:xml:ns:yang:controller:entity-owners","conformance-type":"import"},{"name":"iana-ssh-mac-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-mac-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-mac-algs","conformance-type":"import"},{"name":"ietf-yang-patch_2017-02-22","revision":"2017-02-22","schema":"/rests/modules/ietf-yang-patch?revision=2017-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-patch","conformance-type":"import"},{"name":"ietf-ip_2018-02-22","revision":"2018-02-22","schema":"/rests/modules/ietf-ip?revision=2018-02-22","namespace":"urn:ietf:params:xml:ns:yang:ietf-ip","conformance-type":"import","feature":["ipv6-privacy-autoconf","ipv4-non-contiguous-netmasks"]},{"name":"ietf-ssh-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-client","conformance-type":"import","feature":["ssh-client-keepalives","client-ident-hostbased","client-ident-publickey","client-ident-password"]},{"name":"aaa-cert-mdsal_2016-03-21","revision":"2016-03-21","schema":"/rests/modules/aaa-cert-mdsal?revision=2016-03-21","namespace":"urn:opendaylight:yang:aaa:cert:mdsal","conformance-type":"import"},{"name":"iana-crypt-hash_2014-08-06","revision":"2014-08-06","schema":"/rests/modules/iana-crypt-hash?revision=2014-08-06","namespace":"urn:ietf:params:xml:ns:yang:iana-crypt-hash","conformance-type":"import","feature":["crypt-hash-sha-512","crypt-hash-sha-256","crypt-hash-md5"]},{"name":"ietf-restconf_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf","conformance-type":"import"},{"name":"ietf-netconf_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:netconf:base:1.0","conformance-type":"import","feature":["xpath","url","rollback-on-error","validate","startup","candidate","confirmed-commit","writable-running"]},{"name":"aaa_2016-12-14","revision":"2016-12-14","schema":"/rests/modules/aaa?revision=2016-12-14","namespace":"urn:opendaylight:params:xml:ns:yang:aaa","conformance-type":"import"},{"name":"ietf-yang-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-yang-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-types","conformance-type":"import"},{"name":"iana-tls-cipher-suite-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-tls-cipher-suite-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-tls-cipher-suite-algs","conformance-type":"import"},{"name":"aaa-cert_2015-11-26","revision":"2015-11-26","schema":"/rests/modules/aaa-cert?revision=2015-11-26","namespace":"urn:opendaylight:yang:aaa:cert","conformance-type":"import"},{"name":"iana-ssh-public-key-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-public-key-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-public-key-algs","conformance-type":"import"},{"name":"ietf-netconf-with-defaults_2011-06-01","revision":"2011-06-01","schema":"/rests/modules/ietf-netconf-with-defaults?revision=2011-06-01","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults","conformance-type":"import"},{"name":"ietf-tcp-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-client","conformance-type":"import","feature":["local-binding-supported","tcp-client-keepalives"]},{"name":"ietf-origin_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-origin?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-origin","conformance-type":"import"},{"name":"notifications_2008-07-14","revision":"2008-07-14","schema":"/rests/modules/notifications?revision=2008-07-14","namespace":"urn:ietf:params:xml:ns:netconf:notification:1.0","conformance-type":"import"},{"name":"ietf-subscribed-notifications_2019-09-09","revision":"2019-09-09","schema":"/rests/modules/ietf-subscribed-notifications?revision=2019-09-09","namespace":"urn:ietf:params:xml:ns:yang:ietf-subscribed-notifications","conformance-type":"import","feature":["subtree","encode-xml","encode-json"]},{"name":"odl-device-notification_2024-02-18","revision":"2024-02-18","schema":"/rests/modules/odl-device-notification?revision=2024-02-18","namespace":"urn:opendaylight:device:notification","conformance-type":"import"},{"name":"ietf-restconf-monitoring_2017-01-26","revision":"2017-01-26","schema":"/rests/modules/ietf-restconf-monitoring?revision=2017-01-26","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring","conformance-type":"import"},{"name":"opendaylight-l2-types_2013-08-27","revision":"2013-08-27","schema":"/rests/modules/opendaylight-l2-types?revision=2013-08-27","namespace":"urn:opendaylight:l2:types","conformance-type":"import"},{"name":"yang-ext_2013-07-09","revision":"2013-07-09","schema":"/rests/modules/yang-ext?revision=2013-07-09","namespace":"urn:opendaylight:yang:extension:yang-ext","conformance-type":"import"},{"name":"ietf-ssh-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-common","conformance-type":"import","feature":["ssh-x509-certs","transport-params"]},{"name":"ietf-ssh-server_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-ssh-server?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-ssh-server","conformance-type":"import","feature":["local-users-supported","local-user-auth-publickey","local-user-auth-password","ssh-server-keepalives","local-user-auth-hostbased"]},{"name":"ietf-interfaces_2018-02-20","revision":"2018-02-20","schema":"/rests/modules/ietf-interfaces?revision=2018-02-20","namespace":"urn:ietf:params:xml:ns:yang:ietf-interfaces","conformance-type":"import","feature":["pre-provisioning","if-mib","arbitrary-names"]},{"name":"ietf-inet-types_2013-07-15","revision":"2013-07-15","schema":"/rests/modules/ietf-inet-types?revision=2013-07-15","namespace":"urn:ietf:params:xml:ns:yang:ietf-inet-types","conformance-type":"import"},{"name":"aaa-password-service-config_2017-06-19","revision":"2017-06-19","schema":"/rests/modules/aaa-password-service-config?revision=2017-06-19","namespace":"urn:opendaylight:aaa:password:service:config","conformance-type":"import"},{"name":"ietf-network-instance_2019-01-21","revision":"2019-01-21","schema":"/rests/modules/ietf-network-instance?revision=2019-01-21","namespace":"urn:ietf:params:xml:ns:yang:ietf-network-instance","conformance-type":"import"},{"name":"odl-general-entity_2015-09-30","revision":"2015-09-30","schema":"/rests/modules/odl-general-entity?revision=2015-09-30","namespace":"urn:opendaylight:params:xml:ns:yang:mdsal:core:general-entity","conformance-type":"import"},{"name":"ietf-yang-metadata_2016-08-05","revision":"2016-08-05","schema":"/rests/modules/ietf-yang-metadata?revision=2016-08-05","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-metadata","conformance-type":"import"},{"name":"ietf-restconf-subscribed-notifications_2019-11-17","revision":"2019-11-17","schema":"/rests/modules/ietf-restconf-subscribed-notifications?revision=2019-11-17","namespace":"urn:ietf:params:xml:ns:yang:ietf-restconf-subscribed-notifications","conformance-type":"import"},{"name":"ietf-tcp-common_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tcp-common?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tcp-common","conformance-type":"import","feature":["keepalives-supported"]},{"name":"ietf-netconf-notifications_2012-02-06","revision":"2012-02-06","schema":"/rests/modules/ietf-netconf-notifications?revision=2012-02-06","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-notifications","conformance-type":"import"},{"name":"cluster-admin_2025-01-31","revision":"2025-01-31","schema":"/rests/modules/cluster-admin?revision=2025-01-31","namespace":"urn:opendaylight:params:xml:ns:yang:controller:md:sal:cluster:admin","conformance-type":"import"},{"name":"ietf-yang-library_2019-01-04","revision":"2019-01-04","schema":"/rests/modules/ietf-yang-library?revision=2019-01-04","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-library","conformance-type":"import"},{"name":"ietf-tls-client_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-tls-client?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-tls-client","conformance-type":"import","feature":["client-ident-x509-cert","server-auth-x509-cert"]},{"name":"sal-remote-augment_2023-11-03","revision":"2023-11-03","schema":"/rests/modules/sal-remote-augment?revision=2023-11-03","namespace":"urn:sal:restconf:event:subscription","conformance-type":"import"},{"name":"ietf-netconf-acm_2018-02-14","revision":"2018-02-14","schema":"/rests/modules/ietf-netconf-acm?revision=2018-02-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-acm","conformance-type":"import"},{"name":"aaa-cert-rpc_2015-12-15","revision":"2015-12-15","schema":"/rests/modules/aaa-cert-rpc?revision=2015-12-15","namespace":"urn:opendaylight:yang:aaa:cert:rpc","conformance-type":"import"},{"name":"overlay_2015-01-05","revision":"2015-01-05","schema":"/rests/modules/overlay?revision=2015-01-05","namespace":"urn:opendaylight:params:xml:ns:yang:overlay","conformance-type":"import"},{"name":"ietf-http-server_2025-11-11","revision":"2025-11-11","schema":"/rests/modules/ietf-http-server?revision=2025-11-11","namespace":"urn:ietf:params:xml:ns:yang:ietf-http-server","conformance-type":"import","feature":["basic-auth","local-users-supported","tcp-supported","tls-supported","client-auth-supported"]},{"name":"ietf-keystore_2024-10-10","revision":"2024-10-10","schema":"/rests/modules/ietf-keystore?revision=2024-10-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-keystore","conformance-type":"import","feature":["asymmetric-keys","inline-definitions-supported"]},{"name":"ietf-yang-schema-mount_2019-01-14","revision":"2019-01-14","schema":"/rests/modules/ietf-yang-schema-mount?revision=2019-01-14","namespace":"urn:ietf:params:xml:ns:yang:ietf-yang-schema-mount","conformance-type":"import"},{"name":"ietf-netconf-nmda_2019-01-07","revision":"2019-01-07","schema":"/rests/modules/ietf-netconf-nmda?revision=2019-01-07","namespace":"urn:ietf:params:xml:ns:yang:ietf-netconf-nmda","conformance-type":"import","feature":["with-defaults","origin"]},{"name":"iana-ssh-key-exchange-algs_2024-10-16","revision":"2024-10-16","schema":"/rests/modules/iana-ssh-key-exchange-algs?revision=2024-10-16","namespace":"urn:ietf:params:xml:ns:yang:iana-ssh-key-exchange-algs","conformance-type":"import"},{"name":"ietf-x509-cert-to-name_2014-12-10","revision":"2014-12-10","schema":"/rests/modules/ietf-x509-cert-to-name?revision=2014-12-10","namespace":"urn:ietf:params:xml:ns:yang:ietf-x509-cert-to-name","conformance-type":"import"},{"name":"odl-codegen-extensions_2024-06-27","revision":"2024-06-27","schema":"/rests/modules/odl-codegen-extensions?revision=2024-06-27","namespace":"urn:opendaylight:yang:extension:codegen","conformance-type":"import"}],"module-set-id":"2"}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.826909" elapsed="0.006027"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.826426" elapsed="0.006559"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.826385" elapsed="0.006627"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.835459" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.833285" elapsed="0.002219"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.833068" elapsed="0.002470"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.833051" elapsed="0.002511"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.836108" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.835717" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.836443" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.836204" elapsed="0.000297"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.836988" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.836677" elapsed="0.000338"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.836525" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.836185" elapsed="0.000886"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.837579" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.837223" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.837896" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.837673" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.838437" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.838146" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.837992" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.837655" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.838659" elapsed="0.000360"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.839460" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.839178" elapsed="0.000307"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.839633" elapsed="0.002121"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.825454" elapsed="0.016361"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.842000" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.841883" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.841865" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.847827" level="INFO">${text_normalized} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.842207" elapsed="0.005652"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.847912" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:44.848082" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${accept}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=${normalize_json}</arg>
<arg>jmes_path=${jmes_expression}</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>keys_with_volatiles=${volatiles_list}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.808870" elapsed="0.039238"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.848170" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:44.848359" level="INFO">${response_text} = {
 "ietf-yang-library:modules-state": {
  "module": [
   {
    "conformance-type": "import",
    "feature": [
     "arbitrary-names",
     "if-mib",
     "pre-provisioning"
    ],
    "name": "ietf-in...</msg>
<var>${response_text}</var>
<arg>folder=${folder}</arg>
<arg>mapping=${mapping}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>Resolve URI from folder, call Get_From_Uri, return response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.718824" elapsed="0.129587"/>
</kw>
<if>
<branch type="IF" condition="${verify}">
<kw name="Verify_Response_As_Json_Templated" owner="TemplatedRequests">
<arg>response=${response_text}</arg>
<arg>folder=${folder}</arg>
<arg>base_name=data</arg>
<arg>mapping=${mapping}</arg>
<arg>iterations=${iterations}</arg>
<arg>iter_start=${iter_start}</arg>
<arg>iter_j_offset=${iter_j_offset}</arg>
<doc>Resolve expected JSON data, should be equal to provided ${response}.
JSON normalization is used, endlines enabled for readability.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.848876" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.848578" elapsed="0.000449"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.848528" elapsed="0.000545"/>
</if>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.849164" elapsed="0.000060"/>
</return>
<arg>session=${session}</arg>
<arg>folder=${RESTCONF_MODULES_DIR}</arg>
<arg>verify=False</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Add arguments sensible for JSON data, return Get_Templated response text.
Optionally, verification against JSON data (may be iterated) is called.
Only subset of JSON data is verified and returned if JMES path is specified in
file ${folder}/jmespath.expr.</doc>
<status status="PASS" start="2026-04-07T17:21:44.713949" elapsed="0.135458"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.709757" elapsed="0.139727"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.709738" elapsed="0.139805"/>
</if>
<kw name="Resolve_Shard_Type_Class" owner="ClusterManagement">
<if>
<branch type="IF" condition="'${shard_type}' == 'config'">
<return>
<value>DistributedConfigDatastore</value>
<status status="PASS" start="2026-04-07T17:21:44.850660" elapsed="0.000074"/>
</return>
<status status="PASS" start="2026-04-07T17:21:44.850463" elapsed="0.000331"/>
</branch>
<branch type="ELSE IF" condition="'${shard_type}' == 'operational'">
<return>
<value>DistributedOperationalDatastore</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.850948" elapsed="0.000053"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.850841" elapsed="0.000202"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.850403" elapsed="0.000676"/>
</if>
<kw name="Fail" owner="BuiltIn">
<arg>Unrecognized shard type: ${shard_type}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.851990" elapsed="0.000056"/>
</kw>
<msg time="2026-04-07T17:21:44.852175" level="INFO">${type_class} = DistributedConfigDatastore</msg>
<var>${type_class}</var>
<arg>shard_type=${shard_type}</arg>
<doc>Simple lookup for class name corresponding to desired type.</doc>
<status status="PASS" start="2026-04-07T17:21:44.849801" elapsed="0.002435"/>
</kw>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.853481" level="INFO">${cluster_index} = 3</msg>
<var>${cluster_index}</var>
<arg>${member_index}+${NODE_ROLE_INDEX_START}-1</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.852548" elapsed="0.000994"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.855818" level="INFO">${uri} = jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<var>${uri}</var>
<arg>${JOLOKIA_READ_URI}:Category=Shards,name=member-${cluster_index}-shard-${shard_name}-${shard_type},type=${type_class}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.853836" elapsed="0.002048"/>
</kw>
<kw name="Get_As_Json_From_Uri" owner="TemplatedRequests">
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.863084" level="INFO">jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.862815" elapsed="0.000316"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.863587" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.863343" elapsed="0.000287"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:21:44.871172" level="INFO">GET Request : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 path_url=/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:21:44.871230" level="INFO">GET Response : url=http://10.30.170.206:8181/jolokia/read/org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore 
 status=200, reason=OK 
 headers={'Content-Type': 'text/plain;charset=utf-8', 'Cache-Control': 'no-cache', 'Pragma': 'no-cache', 'Date': 'Tue, 07 Apr 2026 17:21:44 GMT', 'Expires': 'Tue, 07 Apr 2026 16:21:44 GMT', 'Transfer-Encoding': 'chunked'} 
 body={"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"289.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200} 
 </msg>
<msg time="2026-04-07T17:21:44.871332" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:21:44.865678" elapsed="0.005679"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.863745" elapsed="0.007654"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.871571" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.871424" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.863725" elapsed="0.007931"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.875095" level="INFO">{"request":{"mbean":"org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore","type":"read"},"value":{"ReadWriteTransactionCount":0,"SnapshotIndex":44,"InMemoryJournalLogSize":1,"ReplicatedToAllIndex":44,"Leader":"member-1-shard-default-config","LastIndex":45,"RaftState":"Follower","LastApplied":45,"LastCommittedTransactionTime":"1970-01-01 00:00:00.000","LastLogIndex":45,"LastLeadershipChangeTime":"2026-04-07 17:13:00.339","PeerAddresses":"member-1-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.170.175:2550\/user\/shardmanager-config\/member-1-shard-default-config, member-2-shard-default-config: pekko:\/\/opendaylight-cluster-data@10.30.171.205:2550\/user\/shardmanager-config\/member-2-shard-default-config","FollowerInitialSyncStatus":true,"FollowerInfo":[],"FailedReadTransactionsCount":0,"StatRetrievalTime":"289.1 μs","Voting":true,"CurrentTerm":2,"LastTerm":2,"FailedTransactionsCount":0,"PendingTxCommitQueueSize":0,"VotedFor":"member-1-shard-default-config","SnapshotCaptureInitiated":false,"CommittedTransactionsCount":0,"TxCohortCacheSize":0,"PeerVotingStates":"member-1-shard-default-config: true, member-2-shard-default-config: true","LastLogTerm":2,"StatRetrievalError":null,"CommitIndex":45,"SnapshotTerm":2,"AbortTransactionsCount":0,"ReadOnlyTransactionCount":0,"ShardName":"member-3-shard-default-config","LeadershipChangeCount":1,"InMemoryJournalDataSize":8487},"timestamp":1775582504,"status":200}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.872762" elapsed="0.002432"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.872548" elapsed="0.002682"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.872529" elapsed="0.002727"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.877810" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:44.875530" elapsed="0.002325"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.875312" elapsed="0.002578"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.875295" elapsed="0.002619"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.878463" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.878092" elapsed="0.000397"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.878788" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.878559" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.879342" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.879043" elapsed="0.000324"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.878872" elapsed="0.000530"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.878541" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.879931" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.879576" elapsed="0.000381"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.880271" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.880043" elapsed="0.000301"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.880814" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:21:44.880522" elapsed="0.000317"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.880368" elapsed="0.000506"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.880024" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:44.881053" elapsed="0.000341"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:21:44.881819" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.881551" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.882006" elapsed="0.002163"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:21:44.872103" elapsed="0.012128"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.884492" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.884384" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.884362" elapsed="0.000198"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<msg time="2026-04-07T17:21:44.887416" level="INFO">${text_normalized} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="PASS" start="2026-04-07T17:21:44.884748" elapsed="0.002696"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="PASS" start="2026-04-07T17:21:44.887545" elapsed="0.000054"/>
</return>
<msg time="2026-04-07T17:21:44.887896" level="INFO">${response_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${ACCEPT_EMPTY}</arg>
<arg>session=${session}</arg>
<arg>normalize_json=True</arg>
<arg>http_timeout=${http_timeout}</arg>
<arg>log_response=${log_response}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:21:44.858154" elapsed="0.029792"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:21:44.888035" elapsed="0.000062"/>
</return>
<msg time="2026-04-07T17:21:44.888379" level="INFO">${data_text} = {
 "request": {
  "mbean": "org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore",
  "type": "read"
 },
 "status": 200,
 "timestamp": 17755825...</msg>
<var>${data_text}</var>
<arg>uri=${uri}</arg>
<arg>session=${session}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Specify JSON headers and return Get_From_Uri normalized response text.</doc>
<status status="PASS" start="2026-04-07T17:21:44.856267" elapsed="0.032173"/>
</kw>
<kw name="Json Parse From String" owner="Utils">
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.890574" level="INFO">${json_data} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${json_data}</var>
<arg>json.loads('''${plain_string_with_json}''')</arg>
<arg>json</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:21:44.889767" elapsed="0.000860"/>
</kw>
<return>
<value>${json_data}</value>
<status status="PASS" start="2026-04-07T17:21:44.890728" elapsed="0.000064"/>
</return>
<msg time="2026-04-07T17:21:44.891285" level="INFO">${data_object} = {'request': {'mbean': 'org.opendaylight.controller:Category=Shards,name=member-3-shard-default-config,type=DistributedConfigDatastore', 'type': 'read'}, 'status': 200, 'timestamp': 1775582504, 'value'...</msg>
<var>${data_object}</var>
<arg>${data_text}</arg>
<doc>Parse given plain string into json (dictionary)</doc>
<status status="PASS" start="2026-04-07T17:21:44.888869" elapsed="0.002478"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.892013" level="INFO">${value} = {'AbortTransactionsCount': 0, 'CommitIndex': 45, 'CommittedTransactionsCount': 0, 'CurrentTerm': 2, 'FailedReadTransactionsCount': 0, 'FailedTransactionsCount': 0, 'FollowerInfo': [], 'FollowerInitial...</msg>
<var>${value}</var>
<arg>${data_object}</arg>
<arg>value</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.891638" elapsed="0.000439"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.892809" level="INFO">${raft_property} = Follower</msg>
<var>${raft_property}</var>
<arg>${value}</arg>
<arg>${property}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.892421" elapsed="0.000449"/>
</kw>
<return>
<value>${raft_property}</value>
<status status="PASS" start="2026-04-07T17:21:44.893112" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:44.893272" level="INFO">${raft_state} = Follower</msg>
<var>${raft_state}</var>
<arg>RaftState</arg>
<arg>${shard_name}</arg>
<arg>${shard_type}</arg>
<arg>${member_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 property.
Optionally, check restconf works.</doc>
<status status="PASS" start="2026-04-07T17:21:44.705952" elapsed="0.187344"/>
</kw>
<return>
<value>${raft_state}</value>
<status status="PASS" start="2026-04-07T17:21:44.893353" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:44.893497" level="INFO">${raft_state} = Follower</msg>
<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="PASS" start="2026-04-07T17:21:44.705201" elapsed="0.188320"/>
</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="PASS" start="2026-04-07T17:21:44.893809" elapsed="0.000241"/>
</kw>
<status status="PASS" start="2026-04-07T17:21:44.893600" elapsed="0.000489"/>
</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-07T17:21:44.894254" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.894113" 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-07T17:21:44.894467" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.894331" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.893582" elapsed="0.000957"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:44.705040" elapsed="0.189522"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.321949" elapsed="0.572642"/>
</for>
<return>
<value>${leader_list}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.894630" elapsed="0.000026"/>
</return>
<msg time="2026-04-07T17:21:44.894829" level="INFO">${leader_list} = [1]</msg>
<msg time="2026-04-07T17:21:44.894895" level="INFO">${follower_list} = [2, 3]</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-07T17:21:44.317943" elapsed="0.576976"/>
</kw>
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.895475" level="INFO">Length is 1.</msg>
<msg time="2026-04-07T17:21:44.895550" level="INFO">${leader_count} = 1</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-07T17:21:44.895207" elapsed="0.000366"/>
</kw>
<if>
<branch type="IF" condition="${leader_count} &lt; 1">
<kw name="Fail" owner="BuiltIn">
<arg>No leader found.</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:44.895852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:44.895643" elapsed="0.000262"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.895625" elapsed="0.000303"/>
</if>
<kw name="Length Should Be" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.897987" level="INFO">Length is 1.</msg>
<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="PASS" start="2026-04-07T17:21:44.896073" elapsed="0.001961"/>
</kw>
<kw name="Get From List" owner="Collections">
<msg time="2026-04-07T17:21:44.898381" level="INFO">${leader} = 1</msg>
<var>${leader}</var>
<arg>${leader_list}</arg>
<arg>0</arg>
<doc>Returns the value specified with an ``index`` from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.898194" elapsed="0.000215"/>
</kw>
<return>
<value>${leader}</value>
<value>${follower_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.898455" elapsed="0.000026"/>
</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="PASS" start="2026-04-07T17:21:44.315430" elapsed="0.583177"/>
</kw>
<var name="${shard_name}">default</var>
<status status="PASS" start="2026-04-07T17:21:44.315159" elapsed="0.583494"/>
</iter>
<var>${shard_name}</var>
<value>@{shard_name_list}</value>
<status status="PASS" start="2026-04-07T17:21:43.730073" elapsed="1.168611"/>
</for>
<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="PASS" start="2026-04-07T17:21:43.729582" elapsed="1.169156"/>
</kw>
<arg>${controller_index_list}</arg>
<doc>Check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:21:42.503820" elapsed="2.395023"/>
</kw>
<arg>90s</arg>
<arg>1s</arg>
<arg>Check Ovsdb Shards Status</arg>
<arg>${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="PASS" start="2026-04-07T17:21:42.503320" elapsed="2.395573"/>
</kw>
<doc>Check Shard Status after some cluster event.</doc>
<status status="PASS" start="2026-04-07T17:21:42.501048" elapsed="2.397909"/>
</kw>
<doc>Create original cluster list and check Status for all shards in Ovsdb application.</doc>
<status status="PASS" start="2026-04-07T17:21:42.179680" elapsed="2.719503"/>
</test>
<test id="s1-s2-s2-t25" name="Check Entity Owner Status After Recover" line="126">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:21:44.902500" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:21:44.902242" 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-07T17:21:44.903742" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.903634" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.903616" 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-07T17:21:44.908356" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.908228" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.908210" elapsed="0.000214"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.909410" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:44.909034" elapsed="0.000402"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:44.909894" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:44.909590" elapsed="0.000329"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:44.909963" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:21:44.910133" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:44.908644" elapsed="0.001513"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.915327" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.915221" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.915202" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:44.916605" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:44.916500" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:44.916482" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:44.917249" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:44.916810" elapsed="0.000466"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:44.917695" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:44.917432" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:44.954441" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:44.918274" elapsed="0.036326"/>
</kw>
<msg time="2026-04-07T17:21:44.954767" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:44.954813" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:44.917875" elapsed="0.036972"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.015529" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:44.955417" elapsed="0.060298"/>
</kw>
<msg time="2026-04-07T17:21:45.015880" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:45.015924" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:44.955030" elapsed="0.060928"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.016287" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.016058" elapsed="0.000345"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.016037" elapsed="0.000392"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.016934" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:45.016566" elapsed="0.000466"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.017310" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.017100" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.017082" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:45.017442" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:45.019755" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:21:45.021219" elapsed="0.000478"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:45.022654" elapsed="0.000341"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:45.018286" elapsed="0.004781"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:45.017694" elapsed="0.005488"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:44.916189" elapsed="0.107093"/>
</kw>
<msg time="2026-04-07T17:21:45.023372" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.023416" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:44.915542" elapsed="0.107909"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:45.023632" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:21:45.023527" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.023508" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.024119" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.024469" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.024541" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:44.914873" elapsed="0.109773"/>
</kw>
<msg time="2026-04-07T17:21:45.024737" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.024780" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:44.910511" elapsed="0.114303"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.025164" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.024888" elapsed="0.000329"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.024871" elapsed="0.000369"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:21:44.910374" elapsed="0.114889"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.031661" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:45.031553" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.031534" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.032920" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:45.032815" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.032797" elapsed="0.000287"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:45.033574" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:45.033224" elapsed="0.000376"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.034058" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:45.033786" elapsed="0.000298"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.070436" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:45.034620" elapsed="0.035988"/>
</kw>
<msg time="2026-04-07T17:21:45.070776" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:45.070821" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.034238" elapsed="0.036617"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.126221" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:45.071424" elapsed="0.054984"/>
</kw>
<msg time="2026-04-07T17:21:45.126575" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:45.126620" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.071040" elapsed="0.055614"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.126943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.126730" elapsed="0.000312"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.126711" elapsed="0.000356"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.127570" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:45.127204" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.127925" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.127716" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.127698" elapsed="0.000342"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:45.128073" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:45.130361" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:21:45.131793" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:45.133221" elapsed="0.000319"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:45.128902" elapsed="0.004707"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:45.128333" elapsed="0.005390"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:45.032516" elapsed="0.101306"/>
</kw>
<msg time="2026-04-07T17:21:45.133912" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.133956" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.031876" elapsed="0.102131"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:45.134191" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:45.134085" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.134067" elapsed="0.000207"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.134647" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.134986" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.135059" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:45.031215" elapsed="0.103992"/>
</kw>
<msg time="2026-04-07T17:21:45.135301" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.135344" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.025514" elapsed="0.109865"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.135695" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.135454" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.135436" elapsed="0.000336"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:21:45.025380" elapsed="0.110415"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.141199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:45.141092" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.141074" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.142451" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:45.142345" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.142327" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:45.143026" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:45.142654" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.143459" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:21:45.143205" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.173489" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:21:45.144035" elapsed="0.029610"/>
</kw>
<msg time="2026-04-07T17:21:45.173812" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:21:45.173858" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.143638" elapsed="0.030254"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:21:45.229281" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:21:45.174461" elapsed="0.055023"/>
</kw>
<msg time="2026-04-07T17:21:45.229652" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:21:45.229697" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.174079" elapsed="0.055652"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.230061" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.229817" elapsed="0.000322"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.229796" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.230665" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "h "e "c "k "[C "E "n "t "i "t "y "[C "O "w "n "e "r "[C "[78CS "[A[78Ct
 "a "t "u "s "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:21:45.230300" elapsed="0.000446"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.231036" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.230811" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.230793" elapsed="0.000344"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:21:45.231168" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:21:45.233470" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:21:45.234901" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:21:45.236381" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:21:45.231993" elapsed="0.004781"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:21:45.231413" elapsed="0.005479"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:21:45.142047" elapsed="0.094962"/>
</kw>
<msg time="2026-04-07T17:21:45.237101" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.237143" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.141412" elapsed="0.095765"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:21:45.237358" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:21:45.237253" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.237235" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.237818" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.238158" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.238229" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:21:45.140733" elapsed="0.097602"/>
</kw>
<msg time="2026-04-07T17:21:45.238427" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:21:45.238470" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.136078" elapsed="0.102426"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.238818" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:21:45.238578" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.238561" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:21:45.135913" elapsed="0.103010"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:21:44.910208" elapsed="0.328743"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:21:44.907856" elapsed="0.331179"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:21:44.903353" elapsed="0.335736"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:44.902908" elapsed="0.336223"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:21:44.900211" elapsed="0.338971"/>
</kw>
<kw name="Get Ovsdb Entity Owner Status For One Device" owner="ClusterOvsdb">
<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-07T17:21:45.272867" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:45.272489" elapsed="0.000404"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.273527" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:45.273064" elapsed="0.000489"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:45.273597" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:45.273749" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:45.272111" 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-07T17:21:45.278271" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:45.278088" elapsed="0.000209"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:45.278662" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.278444" elapsed="0.000329">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.278938" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279140" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279299" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279459" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279635" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279793" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.279984" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.280169" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.290179" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.290374" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.300164" 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-07T17:21:45.300356" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.300423" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.277544" elapsed="0.022999">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:45.300652" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:45.300695" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.276991" elapsed="0.023726"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.300907" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:45.300799" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:45.300781" 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-07T17:21:45.302283" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.302944" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:45.302641" elapsed="0.000343"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:45.303767" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:45.303507" elapsed="0.000286"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:45.303840" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:45.304001" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:45.303173" elapsed="0.000854"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.304570" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:45.304206" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.305287" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:45.304797" elapsed="0.000516"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:45.305704" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:45.327078" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:45.305475" elapsed="0.023441">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.329361" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.329732" 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-07T17:21:45.330119" 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-07T17:21:45.330484" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.330892" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.331275" 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-07T17:21:45.331829" elapsed="0.000044"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.332251" 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-07T17:21:45.332602" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:45.331559" elapsed="0.001161"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.331417" elapsed="0.001359"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.333105" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.333238" elapsed="0.000034"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.301731" elapsed="0.031810">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:45.333795" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:45.333890" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:45.301139" elapsed="0.032804"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:45.335354" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.334631" elapsed="0.000855">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:45.334165" elapsed="0.001455">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:45.334123" elapsed="0.001567">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.335788" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.276438" elapsed="0.059596">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.336540" elapsed="0.000050"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.336915" elapsed="0.000085"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.337061" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:45.274092" elapsed="0.063080">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:45.337337" 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-07T17:21:45.337510" 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-07T17:21:45.337676" 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-07T17:21:45.337832" 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-07T17:21:45.338017" 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-07T17:21:45.338178" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:45.338238" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.271502" elapsed="0.066834">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:46.369550" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:46.369070" elapsed="0.000514"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:46.370088" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:46.369749" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:46.370163" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:21:46.370341" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:46.368568" elapsed="0.001797"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:46.374917" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:46.374728" elapsed="0.000216"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:46.375346" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.375109" elapsed="0.000311">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.375580" elapsed="0.000034"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.375797" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.375951" elapsed="0.000036"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.376128" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.376388" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.376551" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.376726" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.376885" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.386877" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.387087" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.397090" 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-07T17:21:46.397282" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.397348" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.374196" elapsed="0.023267">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:46.397575" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:46.397618" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:46.373622" elapsed="0.024018"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.397841" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:46.397726" elapsed="0.000159"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:46.397706" 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-07T17:21:46.399228" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:46.399907" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:46.399597" elapsed="0.000337"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:46.400899" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:46.400630" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:46.400988" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:46.401141" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:46.400134" elapsed="0.001031"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:46.401683" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:46.401320" elapsed="0.000388"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:46.402224" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:46.401860" elapsed="0.000390"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:46.402633" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:46.412620" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:46.402407" elapsed="0.013779">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.416669" elapsed="0.000052"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.417089" elapsed="0.000047"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.417452" 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-07T17:21:46.417808" 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-07T17:21:46.418229" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.418584" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.419189" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.419563" elapsed="0.000065"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.419936" elapsed="0.000072"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:46.418883" elapsed="0.001199"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.418729" elapsed="0.001412"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.420444" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.420574" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.398671" elapsed="0.022141">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:46.421090" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:46.421188" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:46.398072" elapsed="0.023168"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:46.422670" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.421888" elapsed="0.000913">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:46.421423" elapsed="0.001515">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:46.421381" elapsed="0.001660">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.423144" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.373077" elapsed="0.050284">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.423783" elapsed="0.000049"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.424050" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.424113" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:46.370659" elapsed="0.053551">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:46.424408" 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-07T17:21:46.424584" 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-07T17:21:46.424749" 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-07T17:21:46.424906" 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-07T17:21:46.425083" 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-07T17:21:46.425243" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:46.425304" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:46.367813" elapsed="0.057590">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:47.456866" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:47.456367" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:47.457413" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:47.457092" elapsed="0.000347"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:47.457487" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:47.457663" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:47.455952" 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-07T17:21:47.462573" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:47.462383" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:47.462999" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.462748" elapsed="0.000347">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.463261" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.463472" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.463629" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.463790" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.463985" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.464148" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.464324" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.464481" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.474218" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.474493" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.484301" 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-07T17:21:47.484494" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.484563" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.461825" elapsed="0.022852">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:47.484789" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:47.484833" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:47.461259" elapsed="0.023597"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.485077" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:47.484945" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:47.484925" 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-07T17:21:47.486455" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:47.487169" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:47.486816" elapsed="0.000380"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:47.487993" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:47.487714" elapsed="0.000412"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:47.488184" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:47.488335" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:47.487379" elapsed="0.000981"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:47.488890" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:47.488519" elapsed="0.000397"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:47.489454" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:47.489099" elapsed="0.000381"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:47.489865" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:47.500607" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:47.489637" elapsed="0.013369">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.503280" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.503514" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.503738" 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-07T17:21:47.503961" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.504215" 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-07T17:21:47.504433" 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-07T17:21:47.504862" 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-07T17:21:47.505117" 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-07T17:21:47.505340" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:47.504685" elapsed="0.000735"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.504582" 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-07T17:21:47.505650" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.505731" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.485896" elapsed="0.019986">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:47.506064" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:47.506127" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:47.485292" elapsed="0.020868"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:47.507052" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.506570" elapsed="0.000567">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:47.506277" elapsed="0.000947">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:47.506251" elapsed="0.001017">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.507330" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.460692" elapsed="0.046774">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.507706" 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-07T17:21:47.507930" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.508053" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:47.458005" elapsed="0.050186">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.508418" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:47.508658" 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-07T17:21:47.508886" 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-07T17:21:47.509125" 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-07T17:21:47.509356" 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-07T17:21:47.509576" elapsed="0.000078"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:47.509717" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:47.455179" elapsed="0.054681">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:48.539160" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:48.538663" elapsed="0.000530"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:48.539677" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:48.539362" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:48.539751" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:21:48.539921" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:48.538252" 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-07T17:21:48.544587" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:48.544396" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:48.545012" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.544762" elapsed="0.000534">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.545462" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.545665" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.545823" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.545998" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.546179" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.546340" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.546514" elapsed="0.000031"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.546697" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.556513" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.556706" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.566413" 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-07T17:21:48.566616" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.566742" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.543841" elapsed="0.023021">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:48.566988" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:48.567034" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:48.543285" elapsed="0.023773"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.567268" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:48.567151" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:48.567131" 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-07T17:21:48.568642" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:48.569333" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:48.569020" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:48.570157" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:48.569876" elapsed="0.000307"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:48.570231" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:48.570378" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:48.569542" elapsed="0.000860"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:48.570941" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:48.570577" elapsed="0.000405"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:48.571485" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:48.571141" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:48.571891" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:48.591199" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:48.571669" elapsed="0.021332">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.593193" 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-07T17:21:48.593359" 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-07T17:21:48.593520" 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-07T17:21:48.593679" 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-07T17:21:48.593843" 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-07T17:21:48.594014" 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-07T17:21:48.594284" 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-07T17:21:48.594449" 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-07T17:21:48.594626" elapsed="0.000020"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:48.594160" elapsed="0.000519"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.594087" 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-07T17:21:48.594843" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.594902" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.568099" elapsed="0.026963">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:48.595182" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:48.595225" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:48.567482" elapsed="0.027766"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:48.595855" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.595540" elapsed="0.000374">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:48.595329" elapsed="0.000662">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:48.595311" elapsed="0.000714">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.596077" elapsed="0.000218"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.542717" elapsed="0.053668">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.596563" 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-07T17:21:48.596726" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.596787" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:48.540259" elapsed="0.056626">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:48.597065" 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-07T17:21:48.597240" 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-07T17:21:48.597404" 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-07T17:21:48.597560" 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-07T17:21:48.597719" 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-07T17:21:48.597876" elapsed="0.000019"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:48.597935" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:48.537509" elapsed="0.060538">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:49.633001" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:49.632463" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:49.633541" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:49.633214" elapsed="0.000353"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:49.633618" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:21:49.633809" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:49.631944" elapsed="0.001890"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:49.638491" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:49.638294" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:49.639041" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.638760" elapsed="0.000368">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.639295" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.639512" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.639668" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.639824" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.640017" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.640179" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.640353" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.640508" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.650663" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.650861" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.660716" 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-07T17:21:49.660908" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.660987" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.637731" elapsed="0.023381">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:49.661243" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:49.661292" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:49.637166" elapsed="0.024150"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.661581" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:49.661420" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:49.661396" 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-07T17:21:49.663031" elapsed="0.000213"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:49.663712" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:49.663396" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:49.664537" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:49.664273" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:49.664610" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:49.664757" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:49.663922" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:49.665326" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:49.664937" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:49.665849" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:49.665505" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:49.666342" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:49.676753" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:49.666092" elapsed="0.014558">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.681095" elapsed="0.000054"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.681477" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.681840" 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-07T17:21:49.682276" elapsed="0.000050"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.682656" 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-07T17:21:49.683038" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.683636" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.684036" elapsed="0.000048"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.684391" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:49.683357" elapsed="0.001152"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.683195" elapsed="0.001373"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.684867" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.685027" elapsed="0.000037"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.662477" elapsed="0.022795">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:49.685525" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:49.685623" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:49.661808" elapsed="0.023866"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:49.687208" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.686509" elapsed="0.000760">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:49.685956" elapsed="0.001376">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:49.685911" elapsed="0.001453">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.687410" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.636587" elapsed="0.050921">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.687680" 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-07T17:21:49.687844" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.687906" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:49.634192" elapsed="0.053831">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:49.688191" 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-07T17:21:49.688364" 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-07T17:21:49.688528" 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-07T17:21:49.688683" 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-07T17:21:49.688844" 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-07T17:21:49.689016" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:49.689078" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:49.631105" elapsed="0.058071">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:50.720367" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:50.719842" elapsed="0.000560"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:50.720886" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:50.720572" elapsed="0.000339"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:50.720959" elapsed="0.000063"/>
</return>
<msg time="2026-04-07T17:21:50.721159" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:50.719450" 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-07T17:21:50.725809" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:50.725617" elapsed="0.000218"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:50.726242" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.725999" elapsed="0.000324">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.726484" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.726693" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.726849" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.727026" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.727206" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.727366" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.727539" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.727696" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.737487" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.737679" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.747437" 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-07T17:21:50.747627" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.747692" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.725072" elapsed="0.022737">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:50.747920" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:50.747962" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:50.724496" elapsed="0.023505"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.748213" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:50.748096" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:50.748075" 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-07T17:21:50.749591" elapsed="0.000208"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:50.750288" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:50.749950" elapsed="0.000369"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:50.753052" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:50.752763" elapsed="0.000317"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:50.753173" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:21:50.753327" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:50.750507" elapsed="0.002845"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:50.753920" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:50.753549" elapsed="0.000397"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:50.754475" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:50.754125" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:50.754890" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:50.764292" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:50.754659" elapsed="0.012731">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.767840" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.768251" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.768613" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.768996" elapsed="0.000053"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.769372" 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-07T17:21:50.769746" 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-07T17:21:50.770363" 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-07T17:21:50.770735" elapsed="0.000044"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.771114" elapsed="0.000047"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:50.770081" elapsed="0.001154"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.769893" elapsed="0.001401"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.771595" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.771725" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.749045" elapsed="0.022947">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:50.772248" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:50.772345" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:50.748428" elapsed="0.023968"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:50.773824" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.773077" elapsed="0.000880">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:50.772576" elapsed="0.001561">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:50.772536" elapsed="0.001640">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.774230" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.723940" elapsed="0.050387">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.774539" 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-07T17:21:50.774700" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.774761" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:50.721579" elapsed="0.053279">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:50.775037" 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-07T17:21:50.775213" 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-07T17:21:50.775375" 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-07T17:21:50.775530" 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-07T17:21:50.775688" 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-07T17:21:50.775843" elapsed="0.000018"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:50.775902" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:50.718658" elapsed="0.057363">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:51.807869" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:51.807473" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:51.808427" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:51.808120" elapsed="0.000333"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:51.808498" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:21:51.808657" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:51.807100" elapsed="0.001581"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:51.813543" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:51.813355" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:51.813929" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.813713" elapsed="0.000302">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.814177" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.814368" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.814528" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.814684" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.814912" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.815087" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.815259" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.815414" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.825365" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.825558" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.835282" 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-07T17:21:51.835469" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.835535" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.812667" elapsed="0.022978">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:51.835756" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:51.835798" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:51.812111" elapsed="0.023710"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.836031" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:51.835903" elapsed="0.000172"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:51.835884" 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-07T17:21:51.837414" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:51.838106" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:51.837770" elapsed="0.000362"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:51.839056" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:51.838650" elapsed="0.000434"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:51.839131" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:51.839290" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:51.838319" elapsed="0.000995"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:51.839831" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:51.839468" elapsed="0.000389"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:51.840374" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:51.840026" elapsed="0.000374"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:51.840768" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:51.852313" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:51.840555" elapsed="0.013929">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.854785" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.855045" 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-07T17:21:51.855275" 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-07T17:21:51.855501" 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-07T17:21:51.855732" 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-07T17:21:51.855954" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.856335" 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-07T17:21:51.856568" 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-07T17:21:51.856790" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:51.856163" elapsed="0.000701"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.856067" elapsed="0.000834"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.857127" elapsed="0.000031"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.857212" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.836834" elapsed="0.020529">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:51.857518" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:51.857578" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:51.836241" elapsed="0.021369"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:51.858485" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.858041" elapsed="0.000525">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:51.857724" elapsed="0.000928">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:51.857700" elapsed="0.000996">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.858759" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.811553" elapsed="0.047343">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.859160" 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-07T17:21:51.859386" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.859470" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:51.809009" elapsed="0.050598">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.859892" 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-07T17:21:51.860229" 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-07T17:21:51.860462" 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-07T17:21:51.860680" 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-07T17:21:51.860904" elapsed="0.000057"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:51.861180" elapsed="0.000036"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:51.861275" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:51.806458" elapsed="0.054954">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:52.894502" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:52.893998" elapsed="0.000538"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:52.895042" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:52.894703" elapsed="0.000366"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:52.895117" elapsed="0.000044"/>
</return>
<msg time="2026-04-07T17:21:52.895295" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:52.893578" elapsed="0.001742"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:52.899894" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:52.899705" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:52.900320" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.900084" elapsed="0.000311">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.900581" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.900781" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.900936" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.901115" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.901292" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.901452" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.901623" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.901777" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.911860" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.912171" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.922213" elapsed="0.000044"/>
</kw>
<kw name="Should Be Equal As Integers" owner="BuiltIn">
<arg>${owner_1}</arg>
<arg>${owner_2}</arg>
<arg>Owners for device ${device_name} are not same</arg>
<doc>Fails if objects are unequal after converting them to integers.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.922457" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.922531" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.899168" elapsed="0.023521">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:52.922823" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:52.922869" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:52.898593" elapsed="0.024299"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.923185" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:52.923035" elapsed="0.000195"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:52.923011" elapsed="0.000243"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:52.924726" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:52.925437" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:52.925109" elapsed="0.000354"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:52.926279" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:52.926002" elapsed="0.000305"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:52.926354" elapsed="0.000033"/>
</return>
<msg time="2026-04-07T17:21:52.926508" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:52.925648" elapsed="0.000885"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:52.927165" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:52.926693" elapsed="0.000499"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:52.927691" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:52.927346" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:52.928129" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:52.938390" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:52.927874" elapsed="0.012825">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.940992" 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-07T17:21:52.941240" 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-07T17:21:52.941467" 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-07T17:21:52.941696" 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-07T17:21:52.941926" 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-07T17:21:52.942172" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.942669" 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-07T17:21:52.942901" 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-07T17:21:52.943145" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:52.942492" elapsed="0.000727"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.942375" elapsed="0.000884"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.943452" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.943535" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.924128" elapsed="0.019573">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:52.943870" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:52.943930" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:52.923408" elapsed="0.020556"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:52.944900" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.944437" elapsed="0.000566">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:52.944115" elapsed="0.000978">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:52.944086" elapsed="0.001053">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.945204" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.898045" elapsed="0.047299">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.945586" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.945813" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.945898" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:52.895623" elapsed="0.050508">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.946368" 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-07T17:21:52.946614" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.946847" 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-07T17:21:52.947095" elapsed="0.000030"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:52.947325" 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-07T17:21:52.947548" elapsed="0.000082"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:52.947693" elapsed="0.000022"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:52.892736" elapsed="0.055101">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:53.980755" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:53.980244" elapsed="0.000547"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:53.981311" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:53.980959" elapsed="0.000379"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:53.981388" elapsed="0.000046"/>
</return>
<msg time="2026-04-07T17:21:53.981575" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:53.979808" 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-07T17:21:53.986363" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:53.986165" elapsed="0.000224"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:53.986791" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:53.986539" elapsed="0.000336">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987057" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987267" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987422" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987581" elapsed="0.000019"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987772" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.987949" elapsed="0.000037"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.988142" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.988302" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.998266" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:53.998464" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.008485" 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-07T17:21:54.008686" elapsed="0.000027"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.008854" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:53.985571" elapsed="0.023424">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:54.009116" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:54.009160" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:53.985002" elapsed="0.024181"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.009402" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:54.009273" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:54.009253" 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-07T17:21:54.010876" elapsed="0.000267"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:54.011615" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:54.011299" elapsed="0.000342"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:54.012501" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:54.012228" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:54.012582" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:54.012743" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:54.011836" elapsed="0.000933"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:54.013328" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:54.012928" elapsed="0.000426"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:54.013866" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:54.013509" elapsed="0.000383"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:54.014372" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:54.023089" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:54.014095" elapsed="0.011534">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.025900" elapsed="0.000033"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.026167" 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-07T17:21:54.026395" 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-07T17:21:54.026621" 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-07T17:21:54.026871" 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-07T17:21:54.027117" 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-07T17:21:54.027489" 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-07T17:21:54.027736" elapsed="0.000034"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.028018" elapsed="0.000032"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:54.027315" elapsed="0.000783"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.027214" elapsed="0.000922"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.028328" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.028410" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:54.010279" elapsed="0.018342">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:54.028800" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:54.028877" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:54.009621" elapsed="0.019294"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:54.029880" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:54.029412" elapsed="0.000553">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:54.029096" elapsed="0.000985">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:54.029068" elapsed="0.001059">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.030191" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:53.984422" elapsed="0.045905">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.030570" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.030809" elapsed="0.000032"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.030900" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:53.981918" elapsed="0.049144">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.031294" 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-07T17:21:54.031552" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.031812" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:54.032116" 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-07T17:21:54.032346" 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-07T17:21:54.032522" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:54.032587" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:53.979037" elapsed="0.053656">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:55.061696" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:55.061218" elapsed="0.000511"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:55.062227" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:55.061897" elapsed="0.000356"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:55.062302" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:21:55.062474" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:55.060739" 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-07T17:21:55.067150" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:55.066944" elapsed="0.000233"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:55.067575" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.067323" elapsed="0.000325">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.067808" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068027" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068186" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068345" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068523" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068680" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.068854" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.069024" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.078718" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.078909" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.088716" 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-07T17:21:55.088905" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.088983" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.066413" elapsed="0.022686">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:55.089212" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:55.089255" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:55.065840" elapsed="0.023438"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.089510" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:55.089364" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:55.089344" 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-07T17:21:55.090879" elapsed="0.000225"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:55.091597" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:55.091255" elapsed="0.000368"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:55.092570" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:55.092302" elapsed="0.000295"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:55.092645" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:55.092793" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:55.091803" elapsed="0.001014"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:55.093353" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:55.092987" elapsed="0.000391"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:55.093873" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:55.093530" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:55.094298" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:55.104552" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:55.094073" elapsed="0.012671">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.107022" 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-07T17:21:55.107265" 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-07T17:21:55.107513" 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-07T17:21:55.107739" 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-07T17:21:55.107996" 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-07T17:21:55.108221" 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-07T17:21:55.108587" 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-07T17:21:55.108819" 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-07T17:21:55.109060" elapsed="0.000029"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:55.108414" elapsed="0.000723"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.108316" 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-07T17:21:55.109363" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.109447" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.090341" elapsed="0.019256">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:55.109756" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:55.109819" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:55.089727" elapsed="0.020125"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:55.110813" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.110370" elapsed="0.000526">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:55.110072" elapsed="0.000932">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:55.110045" elapsed="0.001006">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.111116" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.065299" elapsed="0.045951">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.111510" 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-07T17:21:55.111736" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.111822" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:55.062917" elapsed="0.049041">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.112208" 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-07T17:21:55.112448" 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-07T17:21:55.112675" 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-07T17:21:55.112891" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.113137" elapsed="0.000029"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:55.113359" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:55.113443" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:55.060021" elapsed="0.053557">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:56.146598" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:56.146074" elapsed="0.000561"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:56.147160" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:56.146809" elapsed="0.000919"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:56.148104" elapsed="0.000081"/>
</return>
<msg time="2026-04-07T17:21:56.148383" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:56.145664" elapsed="0.002744"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:56.153541" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:56.153341" elapsed="0.000226"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:56.153965" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.153717" elapsed="0.000349">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.154230" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.154448" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.154606" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.154765" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.154958" elapsed="0.000035"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.155137" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.155312" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.155468" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.165322" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.165514" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.175285" 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-07T17:21:56.175476" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.175542" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.152784" elapsed="0.022880">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:56.175778" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:56.175821" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:56.152197" elapsed="0.023647"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.176070" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:56.175935" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:56.175914" 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-07T17:21:56.177460" elapsed="0.000210"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:56.178148" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:56.177821" elapsed="0.000353"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:56.178988" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:56.178696" elapsed="0.000324"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:56.179117" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:21:56.179267" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:56.178363" elapsed="0.000928"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:56.179812" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:56.179445" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:56.180349" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:56.180005" elapsed="0.000369"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:56.180778" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:56.190625" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:56.180532" elapsed="0.013555">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.194498" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.194898" elapsed="0.000048"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.195299" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.195658" 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-07T17:21:56.196068" elapsed="0.000047"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.196428" 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-07T17:21:56.197041" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.197413" 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-07T17:21:56.197759" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:56.196736" elapsed="0.001141"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.196579" elapsed="0.001356"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.198265" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.198398" elapsed="0.000032"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.176902" elapsed="0.021733">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:56.198907" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:56.199036" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:56.176292" elapsed="0.022799"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:56.200473" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.199737" elapsed="0.000868">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:56.199273" elapsed="0.001471">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:56.199233" elapsed="0.001582">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.200915" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.151635" elapsed="0.049540">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.201666" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.202057" elapsed="0.000047"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.202202" elapsed="0.000032"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:56.148882" elapsed="0.053539">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.202781" elapsed="0.000091"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:56.203229" 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-07T17:21:56.203403" 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-07T17:21:56.203558" 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-07T17:21:56.203717" 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-07T17:21:56.203874" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:56.203935" elapsed="0.000014"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:56.144842" elapsed="0.059204">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:57.237810" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:57.237230" elapsed="0.000620"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:57.238398" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:57.238058" elapsed="0.000367"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:57.238477" elapsed="0.000058"/>
</return>
<msg time="2026-04-07T17:21:57.238672" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:57.236776" elapsed="0.001921"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:57.243797" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:57.243600" elapsed="0.000223"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:57.244245" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.243988" elapsed="0.000343">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.244493" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.244723" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.244878" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.245052" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.245363" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.245529" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.245704" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.245862" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.255623" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.256033" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.265723" 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-07T17:21:57.265915" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.265999" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.243057" elapsed="0.023063">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:57.266234" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:57.266278" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:57.242471" elapsed="0.023847"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.266532" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:57.266411" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:57.266388" 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-07T17:21:57.267920" elapsed="0.000236"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:57.268628" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:57.268307" elapsed="0.000347"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:57.269456" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:57.269192" elapsed="0.000294"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:57.269534" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:21:57.269681" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:57.268840" elapsed="0.000865"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:57.270248" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:57.269860" elapsed="0.000414"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:57.270857" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:57.270439" elapsed="0.000445"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:57.271327" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:57.282264" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:57.271066" elapsed="0.015574">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.287219" elapsed="0.000059"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.287672" elapsed="0.000050"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.288072" elapsed="0.000049"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.288443" elapsed="0.000046"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.288816" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.289206" elapsed="0.000048"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.289812" elapsed="0.000047"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.290252" elapsed="0.000101"/>
</kw>
<kw name="Append To List" owner="Collections">
<arg>${candidate_list}</arg>
<arg>${candidate}</arg>
<doc>Adds ``values`` to the end of ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.290679" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:57.289531" elapsed="0.001268"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.289368" elapsed="0.001492"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.291146" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.291208" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.267375" elapsed="0.023951">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:57.291447" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:57.291491" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:57.266744" elapsed="0.024770"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:57.292170" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.291818" elapsed="0.000413">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:57.291599" elapsed="0.000694">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:57.291581" elapsed="0.000744">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.292370" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.241694" elapsed="0.050774">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.292723" 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-07T17:21:57.292895" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.292957" elapsed="0.000029"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:57.239024" elapsed="0.054051">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.293294" 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-07T17:21:57.293472" 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-07T17:21:57.293635" 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-07T17:21:57.293792" 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-07T17:21:57.293960" elapsed="0.000037"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:57.294143" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:57.294204" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:57.235756" elapsed="0.058567">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:58.326278" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:58.325571" elapsed="0.000752"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:58.326852" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:58.326518" elapsed="0.000360"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:58.326935" elapsed="0.000086"/>
</return>
<msg time="2026-04-07T17:21:58.327182" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:58.325112" elapsed="0.002094"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:58.336849" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:58.336608" elapsed="0.000284"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:58.337364" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.337081" elapsed="0.000381">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.337629" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.338344" elapsed="0.000112"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.338788" elapsed="0.000028"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.339001" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.339243" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.339420" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.339598" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.339759" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.354585" elapsed="0.000078"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.355088" elapsed="0.000026"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_2}</var>
<var>${candidate_list_2}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.365011" 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-07T17:21:58.365219" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.365298" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.336047" elapsed="0.029496">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:58.365741" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:58.365821" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:58.335327" elapsed="0.030519"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.366160" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:58.365987" elapsed="0.000223"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:58.365947" elapsed="0.000289"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:21:58.367950" elapsed="0.000238"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:58.368712" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:58.368347" elapsed="0.000392"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:58.369580" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:58.369298" elapsed="0.000311"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:58.369656" elapsed="0.000037"/>
</return>
<msg time="2026-04-07T17:21:58.369832" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:58.368928" elapsed="0.000929"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:58.370434" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:58.370041" elapsed="0.000418"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:58.370963" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:58.370615" elapsed="0.000389"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:58.371420" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:58.436747" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:58.371169" elapsed="0.068333">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.439865" elapsed="0.000048"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.440153" 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-07T17:21:58.440395" 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-07T17:21:58.440633" 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-07T17:21:58.440880" 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-07T17:21:58.441135" elapsed="0.000030"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.441655" elapsed="0.000030"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.441946" 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-07T17:21:58.442211" elapsed="0.000030"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:58.441469" elapsed="0.000820"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.441337" elapsed="0.000993"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.442533" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.442621" elapsed="0.000026"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.367314" elapsed="0.075492">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:58.443031" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:58.443098" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:58.366409" elapsed="0.076724"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:58.444205" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.443610" elapsed="0.000683">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:58.443272" elapsed="0.001114">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:58.443241" elapsed="0.001193">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.444502" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.334614" elapsed="0.110032">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.444901" 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-07T17:21:58.445163" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.445253" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:58.327544" elapsed="0.117856">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.445643" 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-07T17:21:58.445991" elapsed="0.000034"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:58.446218" 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-07T17:21:58.446373" 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-07T17:21:58.446531" 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-07T17:21:58.446687" elapsed="0.000060"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:58.446792" elapsed="0.000016"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:58.323979" elapsed="0.122917">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:21:59.478197" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:59.477693" elapsed="0.000539"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:21:59.478720" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:21:59.478400" elapsed="0.000346"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:21:59.478795" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:21:59.478989" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:21:59.477293" elapsed="0.001723"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:21:59.483873" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:21:59.483682" elapsed="0.000217"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:21:59.484304" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.484065" elapsed="0.000315">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.484541" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.484746" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.484901" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.485076" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.485278" elapsed="0.000022"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.485440" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.485614" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.485780" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.495685" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.495879" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.505743" 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-07T17:21:59.505937" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.506090" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.483139" elapsed="0.023076">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:21:59.506328" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:59.506372" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:59.482463" elapsed="0.023932"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.506602" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:21:59.506485" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:21:59.506464" 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-07T17:21:59.508003" elapsed="0.000215"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:21:59.508682" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:21:59.508371" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:21:59.509519" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:21:59.509255" elapsed="0.000292"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:21:59.509595" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:21:59.509742" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:21:59.508892" elapsed="0.000875"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:21:59.510308" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:21:59.509923" elapsed="0.000411"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:21:59.510835" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:21:59.510490" elapsed="0.000371"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:21:59.511278" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:21:59.521317" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:21:59.511039" elapsed="0.012053">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.523277" 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-07T17:21:59.523447" 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-07T17:21:59.523609" 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-07T17:21:59.523771" 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-07T17:21:59.523938" elapsed="0.000043"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.524123" 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-07T17:21:59.524402" 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-07T17:21:59.524569" 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-07T17:21:59.524726" elapsed="0.000019"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:21:59.524278" elapsed="0.000499"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.524196" 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-07T17:21:59.524946" elapsed="0.000033"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.525020" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.507443" elapsed="0.017725">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:21:59.525311" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:21:59.525354" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:21:59.506819" elapsed="0.018558"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:21:59.526006" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.525674" elapsed="0.000393">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:21:59.525460" elapsed="0.000669">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:21:59.525442" elapsed="0.000719">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.526212" elapsed="0.000027"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.481903" elapsed="0.044479">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.526630" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.526856" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.526942" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:21:59.479318" elapsed="0.047792">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.527339" 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-07T17:21:59.527581" 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-07T17:21:59.527811" 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-07T17:21:59.528049" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:21:59.528278" 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-07T17:21:59.528498" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:21:59.528582" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:21:59.476483" elapsed="0.052235">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:00.559093" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:00.558588" elapsed="0.000539"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:00.559614" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:00.559295" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:00.559689" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:22:00.559867" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:00.558072" elapsed="0.001820"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:22:00.564899" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:00.564678" elapsed="0.000247"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:00.565327" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.565089" elapsed="0.000310">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.565562" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.565770" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.565925" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.566101" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.566277" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.566442" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.566613" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.566769" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.576554" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.576769" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.586806" 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-07T17:22:00.587019" elapsed="0.000023"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.587089" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.564141" elapsed="0.023073">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:00.587330" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:00.587372" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:00.563552" elapsed="0.023843"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.587678" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:00.587486" elapsed="0.000240"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:00.587465" 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-07T17:22:00.589185" elapsed="0.000214"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:00.589868" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:00.589553" elapsed="0.000341"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:00.590843" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:00.590568" elapsed="0.000302"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:00.590917" elapsed="0.000032"/>
</return>
<msg time="2026-04-07T17:22:00.591095" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:00.590096" elapsed="0.001023"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:00.591647" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:00.591277" elapsed="0.000396"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:00.592184" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:00.591826" elapsed="0.000384"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:00.592599" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:00.606074" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:00.592368" elapsed="0.017685">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.610503" elapsed="0.000057"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.610882" elapsed="0.000046"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.611282" elapsed="0.000046"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.611644" 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-07T17:22:00.612044" elapsed="0.000046"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.612402" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.613052" elapsed="0.000048"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${candidate}</var>
<arg>${candidate}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.613434" 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-07T17:22:00.613812" elapsed="0.000058"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:00.612743" elapsed="0.001206"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.612552" elapsed="0.001488"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.614353" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.614488" elapsed="0.000036"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.588557" elapsed="0.026187">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:00.615040" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:00.615138" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:00.587911" elapsed="0.027279"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:00.616820" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.615998" elapsed="0.000963">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:00.615485" elapsed="0.001653">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:00.615440" elapsed="0.001775">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.617282" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.562826" elapsed="0.054556">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.617560" 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-07T17:22:00.617732" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.617808" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:00.560209" elapsed="0.057703">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:00.618098" 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-07T17:22:00.618287" 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-07T17:22:00.618453" 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-07T17:22:00.618609" 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-07T17:22:00.618773" 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-07T17:22:00.618931" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:00.619007" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:00.557265" elapsed="0.061843">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:01.650112" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:01.649614" elapsed="0.000532"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:01.650629" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:01.650313" elapsed="0.000342"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:01.650701" elapsed="0.000040"/>
</return>
<msg time="2026-04-07T17:22:01.650871" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:01.649141" 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-07T17:22:01.655725" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:01.655539" elapsed="0.000211"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:01.656142" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.655897" elapsed="0.000325">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.656382" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.656579" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.656742" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.656902" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.657096" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.657255" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.657429" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.657586" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.667318" elapsed="0.000028"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.667512" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.677286" 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-07T17:22:01.677477" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.677543" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.655003" elapsed="0.022655">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:01.677767" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:01.677810" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:01.654425" elapsed="0.023408"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.678048" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:01.677917" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:01.677898" 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-07T17:22:01.679403" elapsed="0.000207"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:01.680080" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:01.679758" elapsed="0.000348"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:01.680905" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:01.680643" elapsed="0.000289"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:01.681033" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:22:01.681191" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:01.680308" elapsed="0.000907"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:01.681735" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:01.681371" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:01.682275" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:01.681913" elapsed="0.000388"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:01.682678" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:01.692735" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:01.682457" elapsed="0.012590">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.695301" elapsed="0.000031"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.695534" elapsed="0.000029"/>
</kw>
<kw name="Should Not Be Empty" owner="BuiltIn">
<arg>${entity_owner}</arg>
<arg>No owner found for ${device_name}</arg>
<doc>Verifies that the given item is not empty.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.695758" 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-07T17:22:01.696000" 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-07T17:22:01.696250" 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-07T17:22:01.696473" elapsed="0.000028"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.696834" 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-07T17:22:01.697087" 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-07T17:22:01.697313" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:01.696663" elapsed="0.000723"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.696566" elapsed="0.000857"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.697609" elapsed="0.000028"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.697691" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.678853" elapsed="0.018985">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:01.698014" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:01.698078" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:01.678260" elapsed="0.019850"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:01.698951" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.698519" elapsed="0.000538">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:01.698224" elapsed="0.000921">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:01.698198" elapsed="0.000991">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.699251" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.653861" elapsed="0.045537">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.699683" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.699909" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.700017" elapsed="0.000022"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:01.651281" elapsed="0.048891">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.700401" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.700641" 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-07T17:22:01.700868" 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-07T17:22:01.701104" elapsed="0.000029"/>
</kw>
<kw name="Lists Should Be Equal" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${successor_list}</arg>
<arg>Successor list ${successor_list} is not the came as expected ${expected_successor_list}</arg>
<doc>Fails if given lists are unequal.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:01.701336" 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-07T17:22:01.701555" elapsed="0.000027"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:01.701639" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:01.648395" elapsed="0.053379">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:02.733960" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:02.733456" elapsed="0.000558"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:02.734499" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:02.734183" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:02.734572" elapsed="0.000048"/>
</return>
<msg time="2026-04-07T17:22:02.734752" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:02.733031" 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-07T17:22:02.739541" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:02.739352" elapsed="0.000214"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:02.739988" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.739736" elapsed="0.000329">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.740225" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.740429" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.740583" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.740741" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.741011" elapsed="0.000021"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.741174" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.741346" elapsed="0.000019"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.741502" elapsed="0.000019"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.751279" elapsed="0.000029"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.751474" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.761375" 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-07T17:22:02.761566" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.761631" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.738799" elapsed="0.022951">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:02.761879" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:02.761922" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:02.738237" elapsed="0.023707"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.762167" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:02.762048" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:02.762026" 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-07T17:22:02.763537" elapsed="0.000235"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:02.764253" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:02.763922" elapsed="0.000357"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:02.765077" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:02.764797" elapsed="0.000306"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:02.765149" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:02.765295" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:02.764467" elapsed="0.000852"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:02.765839" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:02.765472" elapsed="0.000393"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:02.766377" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:02.766033" elapsed="0.000370"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:02.766800" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:02.779963" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:02.766563" elapsed="0.015884">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.782751" 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-07T17:22:02.783011" 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-07T17:22:02.783241" 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-07T17:22:02.783466" 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-07T17:22:02.783733" elapsed="0.000030"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.783960" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.784353" 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-07T17:22:02.784585" 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-07T17:22:02.784804" elapsed="0.000028"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:02.784178" elapsed="0.000699"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.784077" elapsed="0.000837"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.785126" elapsed="0.000030"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.785209" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.762998" elapsed="0.022360">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:02.785513" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:02.785574" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:02.762382" elapsed="0.023224"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:02.786483" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.786042" elapsed="0.000524">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:02.785720" elapsed="0.000931">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:02.785695" elapsed="0.001001">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.786757" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.737680" elapsed="0.049213">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.787152" 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-07T17:22:02.787378" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.787463" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:02.735089" elapsed="0.052523">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.787906" 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-07T17:22:02.788171" elapsed="0.000029"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${expected_successor_list}</var>
<arg>@{expected_candidate_list_origin}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.788418" elapsed="0.000030"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:02.788639" 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-07T17:22:02.788861" 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-07T17:22:02.789106" elapsed="0.000029"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:02.789192" elapsed="0.000020"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:02.732262" elapsed="0.057066">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:03.820461" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:03.819928" elapsed="0.000567"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:03.821018" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:03.820672" elapsed="0.000373"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:03.821094" elapsed="0.000045"/>
</return>
<msg time="2026-04-07T17:22:03.821275" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:03.819512" 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-07T17:22:03.826215" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:03.826015" elapsed="0.000227"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:03.826626" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.826390" elapsed="0.000323">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.826878" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827112" elapsed="0.000022"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827271" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827433" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827616" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827790" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.827985" elapsed="0.000023"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.828147" elapsed="0.000021"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.838059" elapsed="0.000034"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.838377" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.848293" 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-07T17:22:03.848488" elapsed="0.000022"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.848556" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.825447" elapsed="0.023234">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:03.848798" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:03.848844" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:03.824853" elapsed="0.024014"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.849089" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:03.848954" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:03.848934" 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-07T17:22:03.850502" elapsed="0.000221"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:03.851226" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:03.850876" elapsed="0.000376"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:03.852087" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:03.851800" elapsed="0.000314"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:03.852161" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:03.852311" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:03.851437" elapsed="0.000900"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:03.852875" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:03.852492" elapsed="0.000410"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:03.853422" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:03.853072" elapsed="0.000376"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:03.853844" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:03.863735" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:03.853604" elapsed="0.011937">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.865751" 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-07T17:22:03.865927" 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-07T17:22:03.866110" 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-07T17:22:03.866275" 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-07T17:22:03.866449" 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-07T17:22:03.866611" 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-07T17:22:03.866928" 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-07T17:22:03.867149" 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-07T17:22:03.867315" elapsed="0.000021"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:03.866799" elapsed="0.000571"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.866723" elapsed="0.000673"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.867558" elapsed="0.000035"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.867665" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.849944" elapsed="0.017902">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:03.868031" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:03.868095" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:03.849311" elapsed="0.018817"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:03.869068" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.868553" elapsed="0.000601">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:03.868255" elapsed="0.000987">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:03.868228" elapsed="0.001060">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.869352" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.824287" elapsed="0.045207">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.869752" 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-07T17:22:03.870017" elapsed="0.000037"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.870127" elapsed="0.000027"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:03.821604" elapsed="0.048701">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.870574" elapsed="0.000029"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.870829" 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-07T17:22:03.871100" elapsed="0.000031"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:03.871324" 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-07T17:22:03.871549" 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-07T17:22:03.871783" elapsed="0.000074"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:03.871921" elapsed="0.000021"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:03.818690" elapsed="0.053395">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:04.904765" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:04.904277" elapsed="0.000521"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:04.905556" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:04.905233" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:04.905631" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:22:04.905808" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:04.903874" elapsed="0.001957"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:22:04.910586" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:04.910388" elapsed="0.000225"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:04.911009" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.910758" elapsed="0.000324">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.911243" elapsed="0.000022"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.911445" elapsed="0.000020"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.911599" elapsed="0.000020"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.911755" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.911928" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.912102" elapsed="0.000021"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.912274" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.912430" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.922134" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.922325" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.932037" 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-07T17:22:04.932227" elapsed="0.000021"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.932361" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.909841" elapsed="0.022636">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:04.932589" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:04.932631" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:04.909287" elapsed="0.023367"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.932859" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:04.932741" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:04.932721" 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-07T17:22:04.934247" elapsed="0.000209"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:04.934930" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:04.934616" elapsed="0.000339"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:04.935751" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:04.935489" elapsed="0.000290"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:04.935827" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:04.935988" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:04.935155" elapsed="0.000859"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:04.936535" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:04.936170" elapsed="0.000390"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:04.937072" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:04.936711" elapsed="0.000387"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:04.937478" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:04.948868" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:04.937254" elapsed="0.013386">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.950825" 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-07T17:22:04.951009" 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-07T17:22:04.951173" 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-07T17:22:04.951333" 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-07T17:22:04.951676" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.952053" elapsed="0.000047"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.952636" 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-07T17:22:04.953034" 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-07T17:22:04.953386" elapsed="0.000045"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:04.952359" elapsed="0.001144"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.952205" elapsed="0.001358"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.953866" elapsed="0.000045"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.954033" elapsed="0.000035"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.933692" elapsed="0.020669">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:04.954638" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:04.954738" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:04.933088" elapsed="0.021701"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:04.956207" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.955474" elapsed="0.000866">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:04.955000" elapsed="0.001477">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:04.954932" elapsed="0.001617">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.956650" elapsed="0.000035"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.908729" elapsed="0.048138">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.957281" elapsed="0.000048"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.957639" elapsed="0.000046"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.957776" elapsed="0.000061"/>
</return>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<doc>Returns the owner and a list of successors for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:04.906152" elapsed="0.051902">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.958421" elapsed="0.000045"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<var>${expected_candidate_list_origin}</var>
<arg>${after_stop}</arg>
<arg>${index_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.958855" 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-07T17:22:04.959257" elapsed="0.000046"/>
</kw>
<kw name="Remove Values From List" owner="Collections">
<arg>${expected_successor_list}</arg>
<arg>${owner}</arg>
<doc>Removes all occurrences of given ``values`` from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:04.959467" 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-07T17:22:04.959629" 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-07T17:22:04.959786" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:04.959847" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:04.903125" elapsed="0.056821">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:05.992452" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:05.992033" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:05.992946" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:05.992638" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:05.993033" elapsed="0.000034"/>
</return>
<msg time="2026-04-07T17:22:05.993197" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${candidate_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:05.991587" elapsed="0.001635"/>
</kw>
<kw name="Get_Owner_And_Successors_For_Device" owner="ClusterManagement">
<kw name="Get_Owner_And_Candidates_For_Device" owner="ClusterManagement">
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Singleton" owner="ClusterManagement">
<kw name="Convert To Lower Case" owner="String">
<msg time="2026-04-07T17:22:05.997817" level="INFO">${device_type} = ovsdb</msg>
<var>${device_type}</var>
<arg>${device_type}</arg>
<doc>Converts string to lower case.</doc>
<status status="PASS" start="2026-04-07T17:22:05.997635" elapsed="0.000208"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<msg time="2026-04-07T17:22:05.998249" level="FAIL">Dictionary does not contain key 'ovsdb'.</msg>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="FAIL" start="2026-04-07T17:22:05.998010" elapsed="0.000303">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_prefix}</var>
<arg>${SINGLETON_DEVICE_ID_PREFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.998656" elapsed="0.000023"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_prefix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.998850" elapsed="0.000021"/>
</kw>
<kw name="Dictionary Should Contain Key" owner="Collections">
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Fails if ``key`` is not found from ``dictionary``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999022" elapsed="0.000021"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${device_id_suffix}</var>
<arg>${SINGLETON_DEVICE_ID_SUFFIX}</arg>
<arg>${device_type}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999182" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${device_id_suffix}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999358" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${id}</var>
<arg>${device_id_prefix}${device_name}${device_id_suffix}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999516" elapsed="0.000020"/>
</kw>
<kw name="Log" owner="BuiltIn">
<arg>${id}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999688" elapsed="0.000020"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_ELECTION_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:05.999843" elapsed="0.000020"/>
</kw>
<kw name="Get_Owner_And_Candidates_For_Type_And_Id" owner="ClusterManagement">
<var>${owner_1}</var>
<var>${candidate_list_1}</var>
<arg>${type}</arg>
<arg>${id}</arg>
<arg>${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for entity specified by ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.009609" elapsed="0.000027"/>
</kw>
<kw name="Set Variable" owner="BuiltIn">
<var>${type}</var>
<arg>${SINGLETON_CHANGE_OWNERSHIP_ENTITY_TYPE}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.009799" 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 ${type} and ${id}
Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
Bear in mind that for Boron and beyond, candidates are not removed on node down or isolation.
If ${require_candidate_list} is not ${EMPTY}, check whether the actual list of candidates matches.
Note that differs from "given list" semantics used in other keywords,
namely you cannot use ${EMPTY} to stand for "full list" in this keyword.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.019681" 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-07T17:22:06.019869" elapsed="0.000020"/>
</kw>
<return>
<value>${owner_1}</value>
<value>${candidate_list_1}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.019933" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.</doc>
<status status="FAIL" start="2026-04-07T17:22:05.996984" elapsed="0.023072">Dictionary does not contain key 'ovsdb'.</status>
</kw>
<msg time="2026-04-07T17:22:06.020167" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:06.020209" level="INFO">${results} = Dictionary does not contain key 'ovsdb'.</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Singleton</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:05.996423" elapsed="0.023808"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status}&quot;==&quot;PASS&quot;">
<return>
<value>${results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.020496" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.020315" elapsed="0.000233"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.020296" elapsed="0.000275"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Get_Owner_And_Candidates_For_Device_Rpc" owner="ClusterManagement">
<kw name="Comment" owner="BuiltIn">
<arg>TODO: Can this implementation be changed to call Get_Owner_And_Candidates_For_Type_And_Id?</arg>
<doc>Displays the given messages in the log file as keyword arguments.</doc>
<status status="PASS" start="2026-04-07T17:22:06.021870" elapsed="0.000234"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.022569" level="INFO">${index} = 1</msg>
<var>${index}</var>
<arg>${member_index}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="PASS" start="2026-04-07T17:22:06.022259" elapsed="0.000336"/>
</kw>
<kw name="Resolve_IP_Address_For_Member" owner="ClusterManagement">
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:06.023595" level="INFO">${ip_address} = 10.30.170.175</msg>
<var>${ip_address}</var>
<arg>dictionary=${ClusterManagement__index_to_ip_mapping}</arg>
<arg>key=${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:06.023330" elapsed="0.000291"/>
</kw>
<return>
<value>${ip_address}</value>
<status status="PASS" start="2026-04-07T17:22:06.023668" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:06.023815" level="INFO">${ip} = 10.30.170.175</msg>
<var>${ip}</var>
<arg>member_index=${index}</arg>
<doc>Return node IP address of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:06.022776" elapsed="0.001063"/>
</kw>
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.024381" level="INFO">${entity_type} = ovsdb</msg>
<var>${entity_type}</var>
<arg>'${device_type}' == 'netconf'</arg>
<arg>netconf-node/${device_name}</arg>
<arg>${device_type}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:06.024014" elapsed="0.000392"/>
</kw>
<kw name="Catenate" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.024896" level="INFO">${url} = http://10.30.170.175:8181/rests</msg>
<var>${url}</var>
<arg>SEPARATOR=</arg>
<arg>http://</arg>
<arg>${ip}</arg>
<arg>:8181/</arg>
<arg>${RESTCONF_URI}</arg>
<doc>Catenates the given items together and returns the resulted string.</doc>
<status status="PASS" start="2026-04-07T17:22:06.024556" elapsed="0.000365"/>
</kw>
<kw name="Get Entity" owner="ClusterEntities">
<msg time="2026-04-07T17:22:06.025308" level="INFO">Data 
    {
        "odl-entity-owners:input" : {
            "type": "ovsdb",
            "name": "/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']"
        }
    }
    </msg>
<msg time="2026-04-07T17:22:06.036694" level="FAIL">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${entity_result}</var>
<arg>${url}</arg>
<arg>${entity_type}</arg>
<arg>${device_name}</arg>
<doc>Calls the get-entity rpc on the controller and returns the result in a
dictionary that contains the parsed response in two keys:
"candidates" and "owner"</doc>
<status status="FAIL" start="2026-04-07T17:22:06.025093" elapsed="0.014391">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_candidates}</var>
<arg>${entity_result}</arg>
<arg>candidates</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.039885" elapsed="0.000051"/>
</kw>
<kw name="Get From Dictionary" owner="Collections">
<var>${entity_owner}</var>
<arg>${entity_result}</arg>
<arg>owner</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.040293" 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-07T17:22:06.040648" elapsed="0.000044"/>
</kw>
<kw name="Replace String" owner="String">
<var>${owner}</var>
<arg>${entity_owner}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.041037" elapsed="0.000054"/>
</kw>
<kw name="Convert To Integer" owner="BuiltIn">
<var>${owner}</var>
<arg>${owner}</arg>
<doc>Converts the given item to an integer number.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.041443" elapsed="0.000044"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${candidate_list}</var>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.041795" elapsed="0.000044"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Replace String" owner="String">
<var>${candidate}</var>
<arg>${entity_candidate}</arg>
<arg>member-</arg>
<arg>${EMPTY}</arg>
<doc>Replaces ``search_for`` in the given ``string`` with ``replace_with``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.042420" 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-07T17:22:06.042790" 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-07T17:22:06.043165" elapsed="0.000046"/>
</kw>
<var name="${entity_candidate}"/>
<status status="NOT RUN" start="2026-04-07T17:22:06.042141" elapsed="0.001144"/>
</iter>
<var>${entity_candidate}</var>
<value>@{entity_candidates}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.041938" elapsed="0.001404"/>
</for>
<kw name="Sort List" owner="Collections">
<arg>${candidate_list}</arg>
<doc>Sorts the given list in place.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.043639" elapsed="0.000044"/>
</kw>
<return>
<value>${owner}</value>
<value>${candidate_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.043767" elapsed="0.000033"/>
</return>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:06.021334" elapsed="0.022698">ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</status>
</kw>
<msg time="2026-04-07T17:22:06.044286" level="INFO">${status} = FAIL</msg>
<msg time="2026-04-07T17:22:06.044383" level="INFO">${results} = ConnectionError: ('Connection aborted.', RemoteDisconnected('Remote end closed connection without response'))</msg>
<var>${status}</var>
<var>${results}</var>
<arg>Get_Owner_And_Candidates_For_Device_Rpc</arg>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.020715" elapsed="0.023720"/>
</kw>
<if>
<branch type="IF" condition="'${status}'=='FAIL'">
<kw name="Fail" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.045897" level="FAIL">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<arg>Could not parse owner and candidates for device ${device_name}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="FAIL" start="2026-04-07T17:22:06.045199" elapsed="0.000903">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:06.044695" elapsed="0.001549">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</branch>
<status status="FAIL" start="2026-04-07T17:22:06.044653" elapsed="0.001661">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</if>
<return>
<value>@{results}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.046418" elapsed="0.000036"/>
</return>
<var>${owner}</var>
<var>${candidate_list}</var>
<arg>device_name=${device_name}</arg>
<arg>device_type=${device_type}</arg>
<arg>member_index=${member_index}</arg>
<arg>http_timeout=${http_timeout}</arg>
<doc>Returns the owner and a list of candidates for the SB device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
If parsing as singleton failed, kw try to parse data in old way (without singleton).
Candidates are all members that register to own a device, so the list of candiates includes the owner.
The returned candidate list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
It is recommended to use Get_Owner_And_Successors_For_Device instead of this keyword, see documentation there.</doc>
<status status="FAIL" start="2026-04-07T17:22:05.995873" elapsed="0.050780">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="Create List" owner="BuiltIn">
<var>${successor_list}</var>
<arg>@{candidate_list}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.046900" 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-07T17:22:06.047077" elapsed="0.000021"/>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.047140" 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 ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630 of type ovsdb. Request is sent to member 1.
Successors are those device candidates not elected as owner. The list of successors = (list of candidates) - (owner).
The returned successor list is sorted numerically.
Note that "candidate list" definition currently differs between Beryllium and Boron.
Use Verify_Owner_And_Successors_For_Device if you want the older semantics (inaccessible nodes not present in the list).</doc>
<status status="FAIL" start="2026-04-07T17:22:05.993517" elapsed="0.053721">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${index_list}</arg>
<arg>${owner}</arg>
<arg>Owner ${owner} is not in candidate list ${index_list}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.047399" 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-07T17:22:06.047570" 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-07T17:22:06.047733" 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-07T17:22:06.047889" 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-07T17:22:06.048065" 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-07T17:22:06.048225" elapsed="0.000020"/>
</kw>
<return>
<value>${owner}</value>
<value>${index_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.048285" elapsed="0.000015"/>
</return>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Returns the owner and successors for the SB device ${device_name} of type ${device_type}. Request is sent to member ${member_index}.
For Boron and beyond, candidates are not removed on node down or isolation,
so this keyword expects candidates to be all members from Boron on.
Extra check is done to verify owner and successors are within the ${candidate_list}. This KW is useful when combined with WUKS.
${candidate_list} minus owner is returned as ${successor list}.
Users can still use Get_Owner_And_Successors_For_Device if they are interested in downed candidates,
or for testing heterogeneous clusters.</doc>
<status status="FAIL" start="2026-04-07T17:22:05.990896" elapsed="0.057486">Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<msg time="2026-04-07T17:22:06.048481" level="FAIL">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</msg>
<var>${owner}</var>
<var>${successor_list}</var>
<arg>20s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Verify_Owner_And_Successors_For_Device</arg>
<arg>device_name=${device}</arg>
<arg>device_type=ovsdb</arg>
<arg>member_index=${controller_index}</arg>
<arg>candidate_list=${controller_index_list}</arg>
<doc>Runs the specified keyword and retries if it fails.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.248933" elapsed="20.799637">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</kw>
<return>
<value>${owner}</value>
<value>${successor_list}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.048643" elapsed="0.000016"/>
</return>
<var>${new_owner}</var>
<var>${new_candidate_list}</var>
<arg>ovsdb://uuid/${ovsdb_uuid}</arg>
<arg>1</arg>
<doc>Check Entity Owner Status and identify owner and successors for an ovs device ${device}. Request is sent to controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:21:45.246814" elapsed="20.801927">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</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-07T17:22:06.048965" elapsed="0.000037"/>
</kw>
<doc>Check Entity Owner Status and identify owner and candidate.</doc>
<status status="FAIL" start="2026-04-07T17:21:44.899622" elapsed="21.149532">Keyword 'ClusterManagement.Verify_Owner_And_Successors_For_Device' failed after retrying for 20 seconds. The last error was: Could not parse owner and candidates for device ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630</status>
</test>
<test id="s1-s2-s2-t26" name="Create Bridge Manually and Verify After Recover" line="133">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:06.052716" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:06.052462" 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-07T17:22:06.054011" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.053877" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.053859" elapsed="0.000222"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.058624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.058517" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.058499" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.059661" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:06.059287" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.060157" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:06.059839" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:06.060226" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:06.060379" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:06.058904" elapsed="0.001499"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.065424" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.065317" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.065298" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.066733" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.066626" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.066609" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:06.067346" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:06.066937" elapsed="0.000436"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.067796" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:06.067526" elapsed="0.000296"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.097025" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:06.068508" elapsed="0.028716"/>
</kw>
<msg time="2026-04-07T17:22:06.097416" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:06.097464" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.067996" elapsed="0.029505"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.155539" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:06.098125" elapsed="0.057624"/>
</kw>
<msg time="2026-04-07T17:22:06.155925" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:06.155998" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.097680" elapsed="0.058358"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.156343" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.156118" elapsed="0.000338"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.156097" elapsed="0.000385"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.157023" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:06.156622" elapsed="0.000492"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.157395" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.157181" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.157163" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:06.157530" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.159858" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:22:06.161323" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:06.162721" elapsed="0.000338"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:06.158398" elapsed="0.004731"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:06.157791" elapsed="0.005452"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:06.066325" elapsed="0.097017"/>
</kw>
<msg time="2026-04-07T17:22:06.163431" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.163475" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.065634" elapsed="0.097878"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:06.163696" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:06.163588" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.163569" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.164192" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.164519" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.164589" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:06.064983" elapsed="0.099721"/>
</kw>
<msg time="2026-04-07T17:22:06.164794" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.164837" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.060757" elapsed="0.104115"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.165218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.164946" elapsed="0.000326"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.164929" elapsed="0.000366"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:06.060622" elapsed="0.104696"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.170460" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.170352" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.170333" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.171714" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.171606" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.171588" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:06.172293" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:06.171920" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.172786" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:06.172473" elapsed="0.000340"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.206083" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:06.173612" elapsed="0.032666"/>
</kw>
<msg time="2026-04-07T17:22:06.206461" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:06.206507" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.173223" elapsed="0.033320"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.267267" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:06.207183" elapsed="0.060279"/>
</kw>
<msg time="2026-04-07T17:22:06.267628" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:06.267674" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.206714" elapsed="0.060997"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.268031" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.267787" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.267768" elapsed="0.000365"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.268651" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:06.268272" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.269037" elapsed="0.000190"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.268806" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.268787" elapsed="0.000524"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:06.269345" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.271669" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:22:06.273124" elapsed="0.000467"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:06.274533" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:06.270222" elapsed="0.004697"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:06.269601" elapsed="0.005450"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:06.171307" elapsed="0.103844"/>
</kw>
<msg time="2026-04-07T17:22:06.275240" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.275284" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.170678" elapsed="0.104644"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:06.275502" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:06.275397" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.275378" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.275964" elapsed="0.000041"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.276307" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.276377" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:06.170009" elapsed="0.106569"/>
</kw>
<msg time="2026-04-07T17:22:06.276673" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.276716" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.165572" elapsed="0.111181"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.277106" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.276828" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.276810" elapsed="0.000374"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:06.165438" elapsed="0.111769"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.282744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.282617" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.282458" elapsed="0.000357"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.284114" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:06.283964" elapsed="0.000204"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.283943" elapsed="0.000251"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:06.284806" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:06.284370" elapsed="0.000466"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.285352" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:06.285048" elapsed="0.000335"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.319502" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:06.286110" elapsed="0.033586"/>
</kw>
<msg time="2026-04-07T17:22:06.319881" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:06.319928" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.285567" elapsed="0.034398"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.382317" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:06.320592" elapsed="0.061930"/>
</kw>
<msg time="2026-04-07T17:22:06.382838" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:06.382884" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.320183" elapsed="0.062738"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.383244" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.383022" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.383001" elapsed="0.000352"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.383902" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "M "a "n "u "a "[78Cl "[A[78Cl
 "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:06.383526" elapsed="0.000482"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.384289" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.384076" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.384058" elapsed="0.000332"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:06.384423" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.386954" elapsed="0.000546"/>
</kw>
<kw name="Open 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-07T17:22:06.388447" elapsed="0.000510"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:06.389878" elapsed="0.000339"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:06.385282" elapsed="0.005005"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:06.384693" elapsed="0.005707"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:06.283604" elapsed="0.106897"/>
</kw>
<msg time="2026-04-07T17:22:06.390593" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.390636" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.282963" elapsed="0.107711"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:06.390858" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:06.390752" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.390733" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.391368" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.391698" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:06.391769" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:06.282129" elapsed="0.109748"/>
</kw>
<msg time="2026-04-07T17:22:06.391996" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:06.392043" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.277466" elapsed="0.114613"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:06.392399" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.392154" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.392137" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:06.277327" elapsed="0.115177"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:06.060453" elapsed="0.332081"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:06.058158" elapsed="0.334433"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:06.053595" elapsed="0.339052"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:06.053145" elapsed="0.339547"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:06.050486" elapsed="0.342260"/>
</kw>
<kw name="Create Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:22:06.400937" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:06.400677" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:06.400659" elapsed="0.000375"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.401326" 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-07T17:22:06.401428" 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-07T17:22:06.401178" elapsed="0.000276"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.402024" level="INFO">Attempting to execute command "sudo ovs-vsctl add-br br-s1" on remote system "10.30.171.56" 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-07T17:22:06.401599" elapsed="0.000472"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.402592" level="INFO">${conn_id} = 705</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-07T17:22:06.402223" elapsed="0.000395"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:06.403592" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:06.403667" 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-07T17:22:06.403307" elapsed="0.000384"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.403845" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:06.405018" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:07.031194" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:21:30 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:06.404690" elapsed="0.626598"/>
</kw>
<msg time="2026-04-07T17:22:07.031354" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.404341" elapsed="0.627080"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:06.402897" elapsed="0.628619"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.031895" level="INFO">Executing command 'sudo ovs-vsctl add-br br-s1'.</msg>
<msg time="2026-04-07T17:22:07.125097" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:07.125338" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:07.125434" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:07.031701" elapsed="0.093806"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:07.125873" elapsed="0.000500"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.127382" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.126760" elapsed="0.000715"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.127901" elapsed="0.000035"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.127636" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.127589" elapsed="0.000502"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:07.128447" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.128211" elapsed="0.000365"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.128176" elapsed="0.000454"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.128704" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.134635" elapsed="0.000314"/>
</kw>
<kw name="Open 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-07T17:22:07.135127" elapsed="0.000152"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:07.135426" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.129399" elapsed="0.006176"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:06.400157" elapsed="0.735510"/>
</kw>
<msg time="2026-04-07T17:22:07.135723" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:06.399512" elapsed="0.736260"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:06.398995" elapsed="0.736859"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.136370" level="INFO">${dictionary_operational} = {'br-s1': '5'}</msg>
<var>${dictionary_operational}</var>
<arg>br-s1=5</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.136048" elapsed="0.000348"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.136861" level="INFO">${dictionary_config} = {'br-s1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.136573" elapsed="0.000313"/>
</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-07T17:22:07.146589" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:07.146205" elapsed="0.000411"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.147096" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:07.146773" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:07.147165" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:07.147317" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.145814" elapsed="0.001528"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.152612" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.152314" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.152682" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.152826" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.151956" elapsed="0.000894"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.159229" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.158965" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.159664" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.159422" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.168217" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.168370" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.168530" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.161686" elapsed="0.006889"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.159774" elapsed="0.008876"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.168898" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.168688" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.159755" elapsed="0.009292"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.173647" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.170490" elapsed="0.003222"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.170185" elapsed="0.003574"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.170159" elapsed="0.003636"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.177190" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.174198" elapsed="0.003055"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.173873" elapsed="0.003427"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.173850" elapsed="0.003485"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.178150" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.177584" elapsed="0.000604"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.178634" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.178286" elapsed="0.000405"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.179190" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.178870" elapsed="0.000347"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.178715" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.178261" elapsed="0.001014"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.179790" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.179427" elapsed="0.000390"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.180170" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.179921" elapsed="0.000307"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.180709" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.180414" elapsed="0.000321"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.180253" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.179901" elapsed="0.000892"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.180936" elapsed="0.000374"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.181793" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.181487" elapsed="0.000332"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.181985" elapsed="0.002163"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.169570" elapsed="0.014641"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.184385" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.184281" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.184262" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.184612" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.184682" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:07.186862" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.153195" elapsed="0.033694"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.186941" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:22:07.187104" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:07.151480" elapsed="0.035649"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.188289" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.187892" elapsed="0.000464"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.187742" elapsed="0.000654"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.187613" elapsed="0.000814"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.187348" elapsed="0.001131"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:07.147542" elapsed="0.040971"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.193949" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.193652" elapsed="0.000339"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.194038" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.194185" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.193300" elapsed="0.000909"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.200413" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.200167" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.200842" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.200604" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.213657" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.213757" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.213849" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.203003" elapsed="0.010905"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.200952" elapsed="0.013001"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.214154" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.214003" elapsed="0.000216"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.200934" elapsed="0.013307"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.221494" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.216309" elapsed="0.005297"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.215796" elapsed="0.005888"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.215755" elapsed="0.005985"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.224634" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.222394" elapsed="0.002285"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.221866" elapsed="0.002847"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.221828" elapsed="0.002910"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.225276" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.224891" elapsed="0.000412"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.225621" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.225373" elapsed="0.000305"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.226172" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.225855" elapsed="0.000343"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.225702" elapsed="0.000532"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.225355" elapsed="0.000901"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.226768" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.226407" elapsed="0.000388"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.227107" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.226864" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.227636" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.227340" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.227188" elapsed="0.000509"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.226846" elapsed="0.000872"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.227859" elapsed="0.000357"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.228647" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.228376" elapsed="0.000297"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.228821" elapsed="0.002316"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.214830" elapsed="0.016370"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.231373" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.231269" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.231251" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.231600" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.231669" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:07.233862" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.194526" elapsed="0.039364"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.233942" elapsed="0.000041"/>
</return>
<msg time="2026-04-07T17:22:07.234108" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:07.192801" elapsed="0.041332"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.235317" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.234931" elapsed="0.000450"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.234785" elapsed="0.000636"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.234655" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.234391" elapsed="0.001112"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:07.188599" elapsed="0.046939"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.240765" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.240471" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.240838" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.240999" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.240126" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.247276" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.247031" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.247709" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.247469" elapsed="0.000283"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.258224" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.258324" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.258415" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.249778" elapsed="0.008662"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.247819" elapsed="0.010662"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.258652" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.258507" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.247801" elapsed="0.010934"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.262121" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.259726" elapsed="0.002442"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.259509" elapsed="0.002693"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.259491" elapsed="0.002735"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.266247" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.262564" elapsed="0.003749"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.262282" elapsed="0.004081"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.262265" elapsed="0.004133"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.267162" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.266620" elapsed="0.000579"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.267619" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.267298" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.268387" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.267947" elapsed="0.000478"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.267733" elapsed="0.000740"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.267272" elapsed="0.001231"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.269239" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.268718" elapsed="0.000557"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.269711" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.269371" elapsed="0.000418"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.270464" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.270057" elapsed="0.000489"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.269822" elapsed="0.000776"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.269346" elapsed="0.001283"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.270828" elapsed="0.000501"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.271923" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.271550" elapsed="0.000408"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.272189" elapsed="0.002822"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.259091" elapsed="0.015983"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.275246" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.275142" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.275124" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.275470" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.275540" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:07.277661" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.241342" elapsed="0.036346"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.277738" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.277885" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:07.239635" elapsed="0.038275"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.279060" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.278673" elapsed="0.000451"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.278529" elapsed="0.000635"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.278401" elapsed="0.000792"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.278143" elapsed="0.001100"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:07.235626" elapsed="0.043650"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:07.147398" elapsed="0.131906"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.145230" elapsed="0.134124"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:22:07.137148" elapsed="0.142258"/>
</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-07T17:22:07.288921" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:07.288545" elapsed="0.000403"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.289431" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:07.289119" elapsed="0.000338"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:07.289501" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.289652" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.288185" elapsed="0.001491"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.295053" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.294742" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.295123" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.295267" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.294405" elapsed="0.000921"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.301451" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.301188" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.301889" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.301647" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.311188" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.312686" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.312796" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.303900" elapsed="0.008921"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.302015" elapsed="0.010848"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.313053" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.312888" elapsed="0.000231"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.301995" elapsed="0.011145"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.316446" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.314170" elapsed="0.002339"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.313933" elapsed="0.002609"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.313915" elapsed="0.002651"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.319275" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.316864" elapsed="0.002474"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.316650" elapsed="0.002736"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.316632" elapsed="0.002787"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.320171" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.319636" elapsed="0.000572"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.320625" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.320306" elapsed="0.000399"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.321399" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.320950" elapsed="0.000486"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.320738" elapsed="0.000748"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.320281" elapsed="0.001235"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.322268" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.321728" elapsed="0.000577"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.322716" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.322401" elapsed="0.000394"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.323466" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.323060" elapsed="0.000448"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.322827" elapsed="0.000730"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.322376" elapsed="0.001211"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.323792" elapsed="0.000511"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.324921" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.324526" elapsed="0.000437"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.325209" elapsed="0.005191"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.313512" elapsed="0.016963"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.330654" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.330550" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.330532" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.330879" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.330949" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:07.333171" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.295648" elapsed="0.037552"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.333250" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.333411" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:07.293907" elapsed="0.039531"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.334670" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.334282" elapsed="0.000480"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.334112" elapsed="0.000698"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.333959" elapsed="0.000883"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.333658" elapsed="0.001250"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:07.289855" elapsed="0.045090"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.340366" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.340024" elapsed="0.000369"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.340438" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.340584" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.339658" elapsed="0.000950"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.346733" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.346483" elapsed="0.000296"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.347188" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.346927" elapsed="0.000305"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.358520" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.359999" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.360110" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.349183" elapsed="0.010953"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.347299" elapsed="0.012879"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.360352" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.360204" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.347280" elapsed="0.013160"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.363874" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.361454" elapsed="0.002527"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.361212" elapsed="0.002806"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.361194" elapsed="0.002848"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.366444" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.364316" elapsed="0.002173"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.364098" elapsed="0.002426"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.364081" elapsed="0.002468"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.367092" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.366705" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.367419" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.367189" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.367948" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.367653" elapsed="0.000335"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.367500" elapsed="0.000525"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.367171" elapsed="0.000876"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.368559" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.368201" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.368878" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.368653" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.369439" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.369128" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.368959" elapsed="0.000542"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.368635" elapsed="0.000887"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.369665" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.370451" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.370183" elapsed="0.000294"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.370625" elapsed="0.002110"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.360782" elapsed="0.012015"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.372983" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.372865" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.372847" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.373210" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.373280" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:22:07.375488" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.340927" elapsed="0.034589"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.375566" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:07.375714" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:07.339162" elapsed="0.036578"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.376926" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.376521" elapsed="0.000500"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.376373" elapsed="0.000689"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.376236" elapsed="0.000856"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.375959" elapsed="0.001185"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:07.335056" elapsed="0.042157"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.382411" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.382113" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:07.382488" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.382633" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.381760" elapsed="0.000897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.388873" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.388626" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.389326" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.389083" elapsed="0.000312"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:07.402197" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:07.402376" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2408'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:07.402485" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:07.391351" elapsed="0.011159"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.389466" elapsed="0.013086"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.402727" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.402578" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.389447" elapsed="0.013365"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.406312" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.403806" elapsed="0.002673"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.403589" elapsed="0.002927"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.403571" elapsed="0.002970"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.408924" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.406818" elapsed="0.002164"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.406597" elapsed="0.002421"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.406580" elapsed="0.002462"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.409591" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.409196" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.409921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.409688" elapsed="0.000306"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.410470" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.410174" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.410019" elapsed="0.000513"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.409670" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.411080" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.410705" elapsed="0.000402"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.411402" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.411176" elapsed="0.000282"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.412215" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:07.411893" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:07.411481" elapsed="0.000795"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.411158" elapsed="0.001140"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.412440" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:07.413221" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:07.412937" elapsed="0.000310"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.413413" elapsed="0.002113"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:07.403170" elapsed="0.012419"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:07.415763" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.415658" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.415640" elapsed="0.000207"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.416004" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.416075" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:07.418277" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:07.382992" elapsed="0.035313"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:07.418356" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:07.418503" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:07.381263" elapsed="0.037266"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.419672" level="INFO">Item found from container 5 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:07.419303" elapsed="0.000443"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:07.419155" elapsed="0.000631"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:07.419026" elapsed="0.000789"/>
</for>
<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="PASS" start="2026-04-07T17:22:07.418750" elapsed="0.001116"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:07.377303" elapsed="0.042633"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:07.289725" elapsed="0.130255"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.287617" elapsed="0.132415"/>
</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_operational}</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-07T17:22:07.279590" elapsed="0.140494"/>
</kw>
<doc>Create bridge br-s1 using OVS command and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:22:06.396903" elapsed="1.023243"/>
</kw>
<doc>Create bridge with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:22:06.049587" elapsed="1.370680"/>
</test>
<test id="s1-s2-s2-t27" name="Add Port Manually and Verify After Recover" line="137">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:07.423641" elapsed="0.000205"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:07.423380" 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-07T17:22:07.424878" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.424770" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.424751" 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-07T17:22:07.429478" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.429371" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.429353" elapsed="0.000192"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.430523" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:07.430149" elapsed="0.000401"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.431018" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:07.430701" elapsed="0.000345"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:07.431089" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:07.431241" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.429766" elapsed="0.001500"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.436286" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.436179" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.436161" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.437586" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.437480" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.437462" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:07.438167" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.437793" elapsed="0.000400"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.438609" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:07.438347" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.467737" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:07.439180" elapsed="0.028724"/>
</kw>
<msg time="2026-04-07T17:22:07.468093" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:07.468139" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.438787" elapsed="0.029387"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.537840" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:07.468724" elapsed="0.069336"/>
</kw>
<msg time="2026-04-07T17:22:07.538231" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:07.538314" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.468340" elapsed="0.070012"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.538665" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.538430" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.538409" elapsed="0.000359"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.539317" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.538904" elapsed="0.000495"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.539682" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.539470" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.539452" elapsed="0.000330"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:07.539814" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.542163" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.543632" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:07.545072" elapsed="0.000345"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.540663" elapsed="0.004825"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:07.540083" elapsed="0.005521"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:07.437171" elapsed="0.108532"/>
</kw>
<msg time="2026-04-07T17:22:07.545794" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.545837" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.436498" elapsed="0.109375"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:07.546073" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.545950" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.545930" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.546545" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.546870" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.546941" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:07.435830" elapsed="0.111250"/>
</kw>
<msg time="2026-04-07T17:22:07.547171" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.547214" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.431615" elapsed="0.115634"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.547566" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.547323" elapsed="0.000296"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.547306" elapsed="0.000336"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:07.431479" elapsed="0.116186"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.552799" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.552692" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.552673" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.554161" elapsed="0.000046"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.554055" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.554037" elapsed="0.000227"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:07.554759" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.554403" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.555208" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:07.554937" elapsed="0.000297"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.588532" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:07.555772" elapsed="0.032921"/>
</kw>
<msg time="2026-04-07T17:22:07.588862" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:07.588908" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.555385" elapsed="0.033558"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.655456" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:07.589589" elapsed="0.066062"/>
</kw>
<msg time="2026-04-07T17:22:07.655825" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:07.655871" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.589189" elapsed="0.066716"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.656222" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.656003" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.655962" elapsed="0.000361"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.656839" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.656465" elapsed="0.000455"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.657214" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.657003" elapsed="0.000310"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.656983" elapsed="0.000356"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:07.657371" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.659811" elapsed="0.000524"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.661281" elapsed="0.000458"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:07.662636" elapsed="0.000315"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.658365" elapsed="0.004671"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:07.657618" elapsed="0.005532"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:07.553736" elapsed="0.109512"/>
</kw>
<msg time="2026-04-07T17:22:07.663339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.663381" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.553112" elapsed="0.110309"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:07.663605" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.663499" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.663481" elapsed="0.000205"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.664080" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.664443" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.664515" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:07.552355" elapsed="0.112267"/>
</kw>
<msg time="2026-04-07T17:22:07.664713" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.664755" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.547916" elapsed="0.116874"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.665140" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.664864" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.664847" elapsed="0.000381"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:07.547782" elapsed="0.117470"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.670403" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.670296" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.670277" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.671646" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:07.671540" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.671522" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:07.672218" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:07.671851" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.672646" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:07.672397" elapsed="0.000274"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.701463" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:07.673265" elapsed="0.028372"/>
</kw>
<msg time="2026-04-07T17:22:07.701800" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:07.701845" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.672824" elapsed="0.029055"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.765034" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:07.702442" elapsed="0.062806"/>
</kw>
<msg time="2026-04-07T17:22:07.765423" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:07.765470" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.702058" elapsed="0.063447"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.765806" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.765584" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.765564" elapsed="0.000342"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.766441" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "A "d "d "[C "P "o "r "t "[C "M "a "n "u "a "l "l "y "[C "a "[78Cn "[A[78Cd
 "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:07.766067" elapsed="0.000457"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.766802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.766591" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.766573" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:07.766931" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.769251" elapsed="0.000503"/>
</kw>
<kw name="Open 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-07T17:22:07.770657" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:07.772030" elapsed="0.000317"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:07.767811" elapsed="0.004605"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:07.767236" elapsed="0.005292"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:07.671243" elapsed="0.101384"/>
</kw>
<msg time="2026-04-07T17:22:07.772718" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.772761" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.670617" elapsed="0.102179"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:07.772992" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:07.772872" elapsed="0.000182"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.772853" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.773464" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.774001" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:07.774076" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:07.669948" elapsed="0.104237"/>
</kw>
<msg time="2026-04-07T17:22:07.774276" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:07.774318" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.665504" elapsed="0.108848"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:07.774669" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.774426" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.774409" elapsed="0.000337"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:07.665371" elapsed="0.109398"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:07.431315" elapsed="0.343482"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:07.429004" elapsed="0.345845"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:07.424488" elapsed="0.350414"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:07.424069" elapsed="0.350877"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:07.421224" elapsed="0.353810"/>
</kw>
<kw name="Add Sample Port To The Manual Bridge And Verify" owner="ClusterOvsdb">
<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-07T17:22:07.782965" elapsed="0.000060"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:07.782706" elapsed="0.000355"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:07.782688" elapsed="0.000396"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.783363" 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-07T17:22:07.783463" 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-07T17:22:07.783229" elapsed="0.000259"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.784025" level="INFO">Attempting to execute command "sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan" on remote system "10.30.171.56" 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-07T17:22:07.783635" elapsed="0.000472"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.784631" level="INFO">${conn_id} = 710</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-07T17:22:07.784263" elapsed="0.000393"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:07.785573" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:07.785650" 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-07T17:22:07.785295" elapsed="0.000378"/>
</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-07T17:22:07.785825" elapsed="0.000332"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:07.786995" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:08.142446" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:06 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:07.786669" elapsed="0.355857"/>
</kw>
<msg time="2026-04-07T17:22:08.142585" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.786320" elapsed="0.356322"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:07.784867" elapsed="0.357858"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.143088" level="INFO">Executing command 'sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan'.</msg>
<msg time="2026-04-07T17:22:08.206268" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:08.206514" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:08.206610" level="INFO">${stderr} = ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch"...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:08.142893" elapsed="0.063772"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:08.207060" elapsed="0.000457"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.208483" level="INFO">ovs-vsctl: Error detected while setting up 'vx1': vx1: vxlan type requires valid 'remote_ip' argument.  See ovs-vswitchd log for details.
ovs-vsctl: The default log directory is "/var/log/openvswitch".</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.207882" elapsed="0.000701"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.209039" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.208736" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.208692" elapsed="0.000506"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:08.209545" elapsed="0.000056"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.209314" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.209281" elapsed="0.000445"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.209799" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.215468" elapsed="0.000724"/>
</kw>
<kw name="Open 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-07T17:22:08.216548" elapsed="0.000322"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:08.217261" elapsed="0.000236"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.210476" elapsed="0.007139"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:07.782188" elapsed="0.435524"/>
</kw>
<msg time="2026-04-07T17:22:08.217765" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:07.781621" elapsed="0.436191"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl add-port br-s1 vx1 -- set Interface vx1 type=vxlan</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:07.781107" elapsed="0.436823"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.218453" level="INFO">${dictionary_operational} = {'vx1': '2'}</msg>
<var>${dictionary_operational}</var>
<arg>vx1=2</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.218123" elapsed="0.000361"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.218949" level="INFO">${dictionary_config} = {'vx1': '0'}</msg>
<var>${dictionary_config}</var>
<arg>vx1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.218658" elapsed="0.000331"/>
</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-07T17:22:08.228504" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:08.228121" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.229023" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:08.228684" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:08.229093" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.229248" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.227741" elapsed="0.001531"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.234520" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.234221" elapsed="0.000325"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.234591" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.234734" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.233862" elapsed="0.000896"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.241048" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.240764" elapsed="0.000330"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.241492" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.241249" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.248883" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.249052" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.249147" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.243490" elapsed="0.005683"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.241601" elapsed="0.007613"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.249390" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.249240" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.241583" elapsed="0.007891"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.254241" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.250873" elapsed="0.003433"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.250574" elapsed="0.003780"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.250549" elapsed="0.003840"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.257728" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.254764" elapsed="0.003026"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.254465" elapsed="0.003372"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.254442" elapsed="0.003429"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.258634" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.258107" elapsed="0.000564"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.259107" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.258766" elapsed="0.000468"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.259912" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.259495" elapsed="0.000453"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.259273" elapsed="0.000746"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.258741" elapsed="0.001310"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.260765" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.260265" elapsed="0.000536"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.261273" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.260897" elapsed="0.000457"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.261944" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.261635" elapsed="0.000349"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.261387" elapsed="0.000634"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.260872" elapsed="0.001171"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.262186" elapsed="0.000342"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.262963" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.262688" elapsed="0.000317"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.263160" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.249988" elapsed="0.015346"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.265506" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.265404" elapsed="0.000161"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.265386" elapsed="0.000203"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.265729" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.265799" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:08.267919" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.235101" elapsed="0.032845"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.268012" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.268161" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:08.233381" elapsed="0.034805"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.269333" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.268950" elapsed="0.000449"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.268792" elapsed="0.000647"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.268664" elapsed="0.000804"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.268403" elapsed="0.001116"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:08.229458" elapsed="0.040093"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.274852" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.274558" elapsed="0.000321"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.274923" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.275083" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.274220" elapsed="0.000888"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.281168" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.280899" elapsed="0.000314"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.281602" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.281359" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.293260" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.293362" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.293452" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.283658" elapsed="0.009823"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.281710" elapsed="0.011823"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.293913" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.293565" elapsed="0.000541"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.281692" elapsed="0.012464"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.301341" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.296385" elapsed="0.005059"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.295877" elapsed="0.005642"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.295837" elapsed="0.005737"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.306248" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.302203" elapsed="0.004090"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.301696" elapsed="0.004631"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.301659" elapsed="0.004693"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.306875" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.306511" elapsed="0.000391"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.307215" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.306985" elapsed="0.000287"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.307744" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.307448" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.307296" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.306953" elapsed="0.000874"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.308350" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.307993" elapsed="0.000383"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.308669" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.308446" elapsed="0.000280"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.309227" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.308916" elapsed="0.000337"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.308750" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.308428" elapsed="0.000881"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.309450" elapsed="0.000337"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.310228" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.309944" elapsed="0.000309"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.310401" elapsed="0.002233"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.294918" elapsed="0.017778"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.312867" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.312763" elapsed="0.000175"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.312746" elapsed="0.000217"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.313119" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.313189" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:22:08.315300" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.275429" elapsed="0.039940"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.315423" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.315574" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:08.273723" elapsed="0.041877"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.316732" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.316368" elapsed="0.000427"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.316223" elapsed="0.000612"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.316095" elapsed="0.000768"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.315818" elapsed="0.001124"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:08.269638" elapsed="0.047355"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.322162" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.321851" elapsed="0.000337"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.322233" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.322377" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.321516" elapsed="0.000885"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.328436" level="INFO">/rests/data/network-topology:network-topology?content=config</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.328191" elapsed="0.000290"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.328864" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.328628" elapsed="0.000290"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.339861" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 path_url=/rests/data/network-topology:network-topology?content=config 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.339961" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=config 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.340076" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.330865" elapsed="0.009236"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.329000" elapsed="0.011143"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.340314" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.340168" elapsed="0.000209"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.328980" elapsed="0.011421"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.345119" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.341816" elapsed="0.003368"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.341516" elapsed="0.003715"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.341490" elapsed="0.003776"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.348687" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.345644" elapsed="0.003107"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.345345" elapsed="0.003453"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.345320" elapsed="0.003512"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.349576" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.349101" elapsed="0.000502"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.349900" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.349672" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.350447" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.350150" elapsed="0.000322"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.349996" elapsed="0.000511"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.349654" elapsed="0.000908"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.351094" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.350720" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.351415" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.351189" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.351942" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.351653" elapsed="0.000328"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.351501" elapsed="0.000517"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.351172" elapsed="0.000868"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.352183" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.353094" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.352679" elapsed="0.000448"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.353289" elapsed="0.002136"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.340913" elapsed="0.014574"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.355665" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.355562" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.355542" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.355887" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.355957" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:08.358087" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.322716" elapsed="0.035398"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.358163" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.358308" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:08.321036" elapsed="0.037296"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.359468" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.359094" elapsed="0.000438"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.358933" elapsed="0.000638"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.358804" elapsed="0.000796"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.358548" elapsed="0.001102"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:08.317082" elapsed="0.042602"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:08.229325" elapsed="0.130386"/>
</for>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.227188" elapsed="0.132571"/>
</kw>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_CONFIG_TOPO_API}</arg>
<arg>dictionary=${dictionary_config}</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-07T17:22:08.219168" elapsed="0.140641"/>
</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-07T17:22:08.369321" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:08.368924" elapsed="0.000423"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.369801" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:08.369503" elapsed="0.000323"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:08.369869" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.370037" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.368550" elapsed="0.001511"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.376733" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.376433" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.376805" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.376963" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.376095" elapsed="0.000906"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.383081" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.382814" elapsed="0.000312"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.383514" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.383274" elapsed="0.000281"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.391874" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.393274" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.393406" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.385546" elapsed="0.007891"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.383623" elapsed="0.009875"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.393767" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.393543" elapsed="0.000314"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.383604" elapsed="0.010282"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.398483" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:bridge-name":"br-s1","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.395275" elapsed="0.003344"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.394955" elapsed="0.003714"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.394930" elapsed="0.003774"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.402044" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.399107" elapsed="0.003001"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.398780" elapsed="0.003376"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.398757" elapsed="0.003433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.402919" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.402404" elapsed="0.000552"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.403399" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.403078" elapsed="0.000401"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.404162" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.403724" elapsed="0.000473"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.403512" elapsed="0.000734"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.403052" elapsed="0.001224"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.405049" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.404488" elapsed="0.000599"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.405510" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.405190" elapsed="0.000400"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.406074" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.405767" elapsed="0.000333"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.405615" elapsed="0.000519"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.405159" elapsed="0.000997"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.406297" elapsed="0.000338"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.407078" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.406791" elapsed="0.000313"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.407252" elapsed="0.002252"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.394374" elapsed="0.015191"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.409738" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.409633" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.409615" elapsed="0.000208"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.409980" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.410053" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:08.412264" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.377320" elapsed="0.034973"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.412343" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.412492" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:08.375601" elapsed="0.036917"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.413669" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.413303" elapsed="0.000441"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.413157" elapsed="0.000626"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.413028" elapsed="0.000786"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.412737" elapsed="0.001128"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:08.370291" elapsed="0.043643"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.419115" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.418804" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.419186" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.419330" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.418468" elapsed="0.000886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.425431" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.425185" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.425867" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.425626" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.438664" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.439165" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.439277" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.427867" elapsed="0.011436"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.425992" elapsed="0.013352"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.439593" elapsed="0.000056"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.439369" elapsed="0.000378"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.425958" elapsed="0.013835"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.447604" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.442097" elapsed="0.005724"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.441587" elapsed="0.006314"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.441547" elapsed="0.006411"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.451321" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.448604" elapsed="0.002762"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.448119" elapsed="0.003281"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.448080" elapsed="0.003345"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.451941" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.451578" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.452283" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.452054" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.452820" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.452521" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.452364" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.452036" elapsed="0.000883"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.453451" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.453091" elapsed="0.000387"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.453772" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.453548" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.454311" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.454019" elapsed="0.000318"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.453852" elapsed="0.000520"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.453530" elapsed="0.000864"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.454535" elapsed="0.000339"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.455319" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.455050" elapsed="0.000295"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.455491" elapsed="0.002112"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.440595" elapsed="0.017070"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.457836" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.457733" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.457715" elapsed="0.000205"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.458075" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.458146" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:08.460357" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.419667" elapsed="0.040718"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.460435" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.460582" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:08.417990" elapsed="0.042618"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.461781" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.461406" elapsed="0.000451"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.461260" elapsed="0.000637"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.461132" elapsed="0.000794"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.460852" elapsed="0.001141"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:08.414045" elapsed="0.048017"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.467228" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.466914" elapsed="0.000340"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:08.467300" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.467444" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.466578" elapsed="0.000891"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.473732" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.473485" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.474183" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.473925" elapsed="0.000301"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:08.487600" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:08.487870" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '2679'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:08.488055" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:08.476188" elapsed="0.011905"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.474294" elapsed="0.013858"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.488393" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.488187" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.474275" elapsed="0.014235"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.493461" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uuid":"aa5a9d70-1091-4f82-b05a-6935e5d7d0fd","ovsdb:bridge-name":"br-s1","ovsdb:managed-by":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630']","ovsdb:datapath-type":"ovsdb:datapath-type-system","termination-point":[{"tp-id":"br-s1","ovsdb:port-uuid":"199cd074-0a97-49b1-95bc-67bd8fdd8667","ovsdb:ingress-policing-burst":0,"ovsdb:name":"br-s1","ovsdb:interface-uuid":"94261648-d6b5-462c-b2db-7a110918e14a","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-internal","ovsdb:mac-in-use":"72:9d:5a:aa:82:4f","ovsdb:ofport":65534,"ovsdb:ifindex":18},{"tp-id":"vx1","ovsdb:port-uuid":"fd87c49b-bece-490c-add0-cd9ba0a7cad2","ovsdb:ingress-policing-burst":0,"ovsdb:name":"vx1","ovsdb:interface-uuid":"e2a45987-82aa-4330-88f7-3b52d74a1354","ovsdb:ingress-policing-rate":0,"ovsdb:interface-type":"ovsdb:interface-type-vxlan"}],"ovsdb:datapath-id":"00:00:72:9d:5a:aa:82:4f"},{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}],"ovsdb:managed-node-entry":[{"bridge-ref":"/network-topology:network-topology/topology[topology-id='ovsdb:1']/node[node-id='ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1']"}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.489905" elapsed="0.003696"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.489604" elapsed="0.004046"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.489578" elapsed="0.004108"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.497463" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.494091" elapsed="0.003445"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.493764" elapsed="0.003825"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.493740" elapsed="0.003885"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.498571" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.498000" elapsed="0.000608"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.499076" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.498706" elapsed="0.000453"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.499823" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.499408" elapsed="0.000451"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.499192" elapsed="0.000716"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.498680" elapsed="0.001259"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.500676" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.500174" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.501188" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.500841" elapsed="0.000428"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.501861" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:08.501553" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:08.501302" elapsed="0.000620"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.500783" elapsed="0.001160"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.502102" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:08.502887" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:08.502609" elapsed="0.000304"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.503077" elapsed="0.002135"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:08.489021" elapsed="0.016252"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:08.505445" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.505341" elapsed="0.000164"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.505323" elapsed="0.000206"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.505670" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.505739" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:08.507961" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:08.467787" elapsed="0.040217"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:08.508055" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:08.508204" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630/bridge/br-s1","ovsdb:stp_enable":false,"ovsdb:bridge-uu...</msg>
<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="PASS" start="2026-04-07T17:22:08.466100" elapsed="0.042130"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.509400" level="INFO">Item found from container 2 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:08.509029" elapsed="0.000455"/>
</kw>
<var name="${item}">vx1</var>
<status status="PASS" start="2026-04-07T17:22:08.508867" elapsed="0.000656"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:08.508723" elapsed="0.000830"/>
</for>
<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="PASS" start="2026-04-07T17:22:08.508457" elapsed="0.001148"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:08.462154" elapsed="0.047526"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:08.370157" elapsed="0.139557"/>
</for>
<arg>uri=${RFC8040_OPERATIONAL_TOPO_API}</arg>
<arg>dictionary=${dictionary_operational}</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 ${dictionary}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.367997" elapsed="0.141768"/>
</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_operational}</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-07T17:22:08.360012" elapsed="0.149804"/>
</kw>
<doc>Add Port vx1 to br-s1 using OVS command and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:22:07.778869" elapsed="0.731008"/>
</kw>
<doc>Add port with OVS command and verify it gets applied from all instances.</doc>
<status status="PASS" start="2026-04-07T17:22:07.420615" elapsed="1.089392"/>
</test>
<test id="s1-s2-s2-t28" name="Delete the Bridge Manually and Verify After Recover" line="141">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:08.513395" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:08.513132" 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-07T17:22:08.514655" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.514545" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.514526" 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-07T17:22:08.519256" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.519151" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.519134" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.520298" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:08.519908" elapsed="0.000418"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.520777" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:08.520479" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:08.520865" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:08.521034" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.519538" elapsed="0.001522"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.526087" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.525977" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.525947" elapsed="0.000208"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.527347" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.527241" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.527223" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:08.527906" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.527558" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.528363" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:08.528104" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.556670" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:08.528936" elapsed="0.027938"/>
</kw>
<msg time="2026-04-07T17:22:08.557061" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:08.557107" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.528544" elapsed="0.028600"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.617315" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:08.557818" elapsed="0.059719"/>
</kw>
<msg time="2026-04-07T17:22:08.617776" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:08.617825" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.557310" elapsed="0.060552"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.618222" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.617950" elapsed="0.000350"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.617928" elapsed="0.000398"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.618843" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.618465" elapsed="0.000467"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.619234" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.619017" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.618998" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:08.619367" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.621675" elapsed="0.000521"/>
</kw>
<kw name="Open 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-07T17:22:08.623119" elapsed="0.000465"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:08.624490" elapsed="0.000344"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.620219" elapsed="0.004685"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:08.619626" elapsed="0.005408"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:08.526917" elapsed="0.098221"/>
</kw>
<msg time="2026-04-07T17:22:08.625229" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.625273" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.526299" elapsed="0.099011"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:08.625493" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.625386" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.625367" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.625965" elapsed="0.000042"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.626311" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.626383" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:08.525635" elapsed="0.100854"/>
</kw>
<msg time="2026-04-07T17:22:08.626581" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.626624" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.521411" elapsed="0.105249"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.627007" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.626734" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.626718" elapsed="0.000367"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:08.521273" elapsed="0.105835"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.632296" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.632190" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.632171" elapsed="0.000191"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.633673" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.633566" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.633547" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:08.634248" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.633879" elapsed="0.000396"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.634681" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:08.634428" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.664146" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:08.635261" elapsed="0.029055"/>
</kw>
<msg time="2026-04-07T17:22:08.664481" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:08.664528" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.634861" elapsed="0.029704"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.728678" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:08.665159" elapsed="0.063735"/>
</kw>
<msg time="2026-04-07T17:22:08.729082" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:08.729128" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.664753" elapsed="0.064412"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.729457" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.729241" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.729221" elapsed="0.000335"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.730079" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.729696" elapsed="0.000471"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.730444" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.730234" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.730216" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:08.730574" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.733288" elapsed="0.000553"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.734783" elapsed="0.000477"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:08.736157" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.731566" elapsed="0.004976"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:08.730823" elapsed="0.005832"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:08.633227" elapsed="0.103544"/>
</kw>
<msg time="2026-04-07T17:22:08.736863" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.736906" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.632508" elapsed="0.104435"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:08.737145" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.737037" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.737018" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.737610" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.738014" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.738087" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:08.631840" elapsed="0.106355"/>
</kw>
<msg time="2026-04-07T17:22:08.738286" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.738329" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.627362" elapsed="0.111004"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.738685" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.738440" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.738423" elapsed="0.000340"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:08.627226" elapsed="0.111560"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.743960" elapsed="0.000028"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.743854" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.743836" elapsed="0.000207"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.745249" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:08.745143" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.745125" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:08.745801" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:08.745452" elapsed="0.000375"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.746298" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:08.746041" elapsed="0.000283"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.778653" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:08.746854" elapsed="0.032004"/>
</kw>
<msg time="2026-04-07T17:22:08.779081" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:08.779128" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.746480" elapsed="0.032683"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.841139" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:08.779713" elapsed="0.061618"/>
</kw>
<msg time="2026-04-07T17:22:08.841494" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:08.841539" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.779328" elapsed="0.062248"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.841866" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.841652" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.841632" elapsed="0.000354"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.842490" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "t "h "e "[C "B "r "i "d "g "e "[C "M "[78Ca "[A[78Cn
 "u "a "l "l "y "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:08.842128" elapsed="0.000451"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.842852" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.842644" elapsed="0.000313"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.842627" elapsed="0.000374"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:08.843036" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.845301" elapsed="0.000499"/>
</kw>
<kw name="Open 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-07T17:22:08.846700" elapsed="0.000480"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:08.848080" elapsed="0.000314"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:08.843852" elapsed="0.004611"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:08.843285" elapsed="0.005290"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:08.744828" elapsed="0.103867"/>
</kw>
<msg time="2026-04-07T17:22:08.848788" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.848831" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.744188" elapsed="0.104680"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:08.849064" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:08.848944" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.848925" elapsed="0.000222"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.849520" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.850049" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:08.850124" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:08.743520" elapsed="0.106710"/>
</kw>
<msg time="2026-04-07T17:22:08.850322" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:08.850365" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.739056" elapsed="0.111345"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:08.850716" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.850475" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.850458" elapsed="0.000334"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:08.738905" elapsed="0.111909"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:08.521110" elapsed="0.329732"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:08.518782" elapsed="0.332112"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:08.514251" elapsed="0.336697"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:08.513809" elapsed="0.337219"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:08.510918" elapsed="0.340163"/>
</kw>
<kw name="Delete Sample Bridge Manually And Verify" owner="ClusterOvsdb">
<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-07T17:22:08.859154" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:08.858838" elapsed="0.000373"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:08.858820" elapsed="0.000415"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.859522" 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-07T17:22:08.859624" 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-07T17:22:08.859377" elapsed="0.000273"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.860234" level="INFO">Attempting to execute command "sudo ovs-vsctl del-br br-s1" on remote system "10.30.171.56" 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-07T17:22:08.859835" elapsed="0.000446"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.860812" level="INFO">${conn_id} = 715</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-07T17:22:08.860434" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:08.861724" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:08.861800" 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-07T17:22:08.861453" elapsed="0.000371"/>
</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-07T17:22:08.861992" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:08.863146" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:09.192811" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:08 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:08.862818" elapsed="0.330261"/>
</kw>
<msg time="2026-04-07T17:22:09.193235" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.862471" elapsed="0.330910"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:08.861064" elapsed="0.332533"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.194575" level="INFO">Executing command 'sudo ovs-vsctl del-br br-s1'.</msg>
<msg time="2026-04-07T17:22:09.299261" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:09.299558" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:09.299656" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:09.194087" elapsed="0.105620"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:09.300187" elapsed="0.000528"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.301889" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.301218" elapsed="0.000796"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.302510" elapsed="0.000038"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.302203" elapsed="0.000419"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.302147" elapsed="0.000526"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:09.303053" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.302790" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.302758" elapsed="0.000487"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.303321" elapsed="0.000031"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.309413" elapsed="0.000353"/>
</kw>
<kw name="Open 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-07T17:22:09.309929" elapsed="0.000188"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:09.310263" elapsed="0.000096"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.304060" elapsed="0.006351"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:08.858321" elapsed="0.452181"/>
</kw>
<msg time="2026-04-07T17:22:09.310560" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:08.857748" elapsed="0.452864"/>
</kw>
<arg>${ovs_system_ip}</arg>
<arg>sudo ovs-vsctl del-br br-s1</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:08.857259" elapsed="0.453543"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.311343" level="INFO">${dictionary} = {'br-s1': '0'}</msg>
<var>${dictionary}</var>
<arg>br-s1=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.311010" elapsed="0.000360"/>
</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-07T17:22:09.317554" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:09.317172" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.318104" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:09.317738" elapsed="0.000393"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:09.318175" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:09.318327" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:09.316774" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.323788" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.323401" elapsed="0.000414"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:09.323861" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:09.324024" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.323055" elapsed="0.000994"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.330703" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.330455" elapsed="0.000292"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.331170" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.330896" elapsed="0.000317"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:09.339160" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:09.339357" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:09.339462" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:09.333182" elapsed="0.006308"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.331279" elapsed="0.008255"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.339709" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.339560" elapsed="0.000212"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.331261" elapsed="0.008532"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.343106" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.340827" elapsed="0.002389"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.340611" elapsed="0.002641"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.340593" elapsed="0.002684"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.345662" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.343550" elapsed="0.002157"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.343333" elapsed="0.002408"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.343316" elapsed="0.002450"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.346329" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.345925" elapsed="0.000431"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.346658" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.346426" elapsed="0.000289"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.347216" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.346893" elapsed="0.000348"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.346738" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.346408" elapsed="0.000890"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.347810" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.347452" elapsed="0.000384"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.348146" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.347904" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.348700" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.348376" elapsed="0.000350"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.348227" elapsed="0.000534"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.347886" elapsed="0.000896"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.348925" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:09.349926" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.349444" elapsed="0.000509"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.350124" elapsed="0.002125"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:09.340173" elapsed="0.012138"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:09.352496" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.352379" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.352361" elapsed="0.000219"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.352721" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.352789" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:09.354964" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:09.324389" elapsed="0.030619"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:09.355061" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:09.355215" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:22:09.322560" elapsed="0.032681"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.356468" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:09.356058" elapsed="0.000483"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:09.355890" elapsed="0.000690"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:09.355749" elapsed="0.000864"/>
</for>
<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="PASS" start="2026-04-07T17:22:09.355477" elapsed="0.001188"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:09.318620" elapsed="0.038127"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.362094" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.361783" elapsed="0.000338"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:09.362166" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:09.362310" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.361446" elapsed="0.000889"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.368411" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.368157" elapsed="0.000299"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.368840" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.368601" elapsed="0.000282"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:09.380552" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:09.380703" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:09.380805" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:09.370829" elapsed="0.010002"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.368950" elapsed="0.011923"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.381066" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.380898" elapsed="0.000238"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.368931" elapsed="0.012226"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.384403" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.382158" elapsed="0.002302"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.381925" elapsed="0.002568"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.381907" elapsed="0.002611"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.386872" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.384786" elapsed="0.002131"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.384573" elapsed="0.002378"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.384556" elapsed="0.002433"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.387522" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.387144" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.387845" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.387618" elapsed="0.000314"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.388448" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.388135" elapsed="0.000341"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.387959" elapsed="0.000555"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.387600" elapsed="0.000936"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.389064" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.388687" elapsed="0.000404"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.389384" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.389160" elapsed="0.000281"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.389906" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.389616" elapsed="0.000316"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.389464" elapsed="0.000518"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.389142" elapsed="0.000863"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.390149" elapsed="0.000366"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:09.390949" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.390674" elapsed="0.000318"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.391148" elapsed="0.002250"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:09.381508" elapsed="0.011952"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:09.393631" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.393528" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.393510" elapsed="0.000204"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.393853" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.393923" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:09.396075" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:09.362655" elapsed="0.033448"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:09.396154" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:09.396302" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:22:09.360955" elapsed="0.035371"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.397479" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:09.397105" elapsed="0.000441"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:09.396945" elapsed="0.000640"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:09.396817" elapsed="0.000798"/>
</for>
<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="PASS" start="2026-04-07T17:22:09.396553" elapsed="0.001112"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:09.356841" elapsed="0.040856"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.402836" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.402542" elapsed="0.000320"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:09.402907" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:09.403066" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.402205" elapsed="0.000886"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.409160" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.408899" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.409590" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.409350" elapsed="0.000320"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:09.421857" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:09.422024" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '1397'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}} 
 </msg>
<msg time="2026-04-07T17:22:09.422133" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:09.411624" elapsed="0.010535"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.409738" elapsed="0.012463"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.422374" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.422227" elapsed="0.000211"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.409720" elapsed="0.012739"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.427708" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry":[{"interface-type":"ovsdb:interface-type-vxlan"},{"interface-type":"ovsdb:interface-type-tap"},{"interface-type":"ovsdb:interface-type-stt"},{"interface-type":"ovsdb:interface-type-internal"},{"interface-type":"ovsdb:interface-type-patch"},{"interface-type":"ovsdb:interface-type-lisp"},{"interface-type":"ovsdb:interface-type-geneve"},{"interface-type":"ovsdb:interface-type-gre"},{"interface-type":"ovsdb:interface-type-system"}],"ovsdb:ovs-version":"2.17.11","ovsdb:connection-info":{"local-port":6640,"remote-port":53074,"local-ip":"10.30.170.175","remote-ip":"10.30.171.56"},"ovsdb:openvswitch-external-ids":[{"external-id-key":"system-id","external-id-value":""},{"external-id-key":"hostname","external-id-value":"localhost"},{"external-id-key":"rundir","external-id-value":"/var/run/openvswitch"}],"ovsdb:datapath-type-entry":[{"datapath-type":"ovsdb:datapath-type-netdev"},{"datapath-type":"ovsdb:datapath-type-system"}],"ovsdb:manager-entry":[{"target":"tcp:10.30.171.205:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.175:6640","number_of_connections":1,"connected":true},{"target":"tcp:10.30.170.206:6640","number_of_connections":1,"connected":true}]}]}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.423452" elapsed="0.004312"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.423235" elapsed="0.004564"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.423217" elapsed="0.004607"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.430382" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.428114" elapsed="0.002313"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.427879" elapsed="0.002583"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.427863" elapsed="0.002624"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.431031" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.430641" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.431357" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.431128" elapsed="0.000286"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.431891" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.431593" elapsed="0.000323"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.431438" elapsed="0.000514"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.431110" elapsed="0.000879"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.432532" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.432144" elapsed="0.000414"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.432854" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.432628" elapsed="0.000290"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.433474" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.433181" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:09.433019" elapsed="0.000516"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.432610" elapsed="0.000947"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.433699" elapsed="0.000396"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:09.434548" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:09.434273" elapsed="0.000301"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.434721" elapsed="0.002120"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:09.422799" elapsed="0.014104"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:09.437091" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.436985" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.436953" elapsed="0.000222"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.437315" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.437384" elapsed="0.000014"/>
</return>
<msg time="2026-04-07T17:22:09.439835" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:09.403406" elapsed="0.036457"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:09.439914" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:09.440078" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1","node":[{"node-id":"ovsdb://uuid/e28f74da-cb36-4e4b-95a3-49cc2a0e6630","ovsdb:db-version":"8.3.0","ovsdb:interface-type-entry...</msg>
<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="PASS" start="2026-04-07T17:22:09.401715" elapsed="0.038389"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.441279" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:09.440894" elapsed="0.000451"/>
</kw>
<var name="${item}">br-s1</var>
<status status="PASS" start="2026-04-07T17:22:09.440746" elapsed="0.000639"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:09.440615" elapsed="0.000800"/>
</for>
<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="PASS" start="2026-04-07T17:22:09.440326" elapsed="0.001143"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:09.397783" elapsed="0.043720"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:09.318415" elapsed="0.123115"/>
</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 {'br-s1': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:22:09.315958" elapsed="0.125619"/>
</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-07T17:22:09.311551" elapsed="0.130078"/>
</kw>
<doc>Delete bridge br-s1 using OVS command and verify it gets applied in all instances in ${controller_index_list}.</doc>
<status status="PASS" start="2026-04-07T17:22:08.855203" elapsed="0.586489"/>
</kw>
<doc>Delete bridge with OVS command and verify it gets deleted from all instances.</doc>
<status status="PASS" start="2026-04-07T17:22:08.510359" elapsed="0.931454"/>
</test>
<test id="s1-s2-s2-t29" name="Verify Modified Port After Recover" line="145">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:09.444847" elapsed="0.000221"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:09.444590" 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-07T17:22:09.446112" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.446001" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.445981" 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-07T17:22:09.450684" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.450579" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.450561" elapsed="0.000191"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.451775" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:09.451355" elapsed="0.000447"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.452274" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:09.451957" elapsed="0.000343"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:09.452364" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:22:09.452534" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:09.450982" elapsed="0.001577"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.457774" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.457665" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.457645" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.459100" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.458991" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.458953" elapsed="0.000216"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:09.459674" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.459307" elapsed="0.000393"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.460141" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:09.459854" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.488570" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:09.460739" elapsed="0.027997"/>
</kw>
<msg time="2026-04-07T17:22:09.488908" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:09.488954" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.460325" elapsed="0.028731"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.532792" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:09.489617" elapsed="0.043380"/>
</kw>
<msg time="2026-04-07T17:22:09.533187" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:09.533233" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.489225" elapsed="0.044044"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.533567" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.533348" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.533328" elapsed="0.000339"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.534200" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.533807" elapsed="0.000477"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.534562" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.534352" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.534333" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:09.534694" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.537054" elapsed="0.000513"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.538610" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:09.540130" elapsed="0.000365"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.535549" elapsed="0.005018"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:09.534955" elapsed="0.005725"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:09.458664" elapsed="0.082116"/>
</kw>
<msg time="2026-04-07T17:22:09.540872" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.540915" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.458006" elapsed="0.082947"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:09.541156" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.541047" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.541027" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.541638" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.541998" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.542072" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:09.457325" elapsed="0.084853"/>
</kw>
<msg time="2026-04-07T17:22:09.542271" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.542313" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.452909" elapsed="0.089442"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.542673" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.542427" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.542408" elapsed="0.000342"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:09.452774" elapsed="0.089999"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.548353" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.548229" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.548210" elapsed="0.000212"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.549616" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.549511" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.549493" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:09.550288" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.549819" elapsed="0.000496"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.550721" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:09.550467" elapsed="0.000280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.585396" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:09.551296" elapsed="0.034278"/>
</kw>
<msg time="2026-04-07T17:22:09.585752" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:09.585797" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.550900" elapsed="0.034934"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.635088" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:09.586443" elapsed="0.048838"/>
</kw>
<msg time="2026-04-07T17:22:09.635449" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:09.635495" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.586030" elapsed="0.049567"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.635914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.635687" elapsed="0.000330"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.635664" elapsed="0.000381"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.636591" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.636186" elapsed="0.000494"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.636959" elapsed="0.000038"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.636748" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.636729" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:09.637110" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.639543" elapsed="0.000532"/>
</kw>
<kw name="Open 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-07T17:22:09.641009" elapsed="0.000471"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:09.642387" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.637995" elapsed="0.004783"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:09.637391" elapsed="0.005499"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:09.549208" elapsed="0.093797"/>
</kw>
<msg time="2026-04-07T17:22:09.643099" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.643142" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.548569" elapsed="0.094610"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:09.643364" elapsed="0.000039"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.643257" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.643238" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.643859" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.644331" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.644404" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:09.547760" elapsed="0.096774"/>
</kw>
<msg time="2026-04-07T17:22:09.644629" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.644673" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.543045" elapsed="0.101665"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.645046" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.644786" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.644769" elapsed="0.000355"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:09.542894" elapsed="0.102253"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.650530" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.650424" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.650405" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.651805" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.651699" elapsed="0.000199"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.651681" elapsed="0.000244"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:09.652705" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.652337" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.653161" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:09.652886" elapsed="0.000302"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.681994" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:09.653722" elapsed="0.028447"/>
</kw>
<msg time="2026-04-07T17:22:09.682335" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:09.682381" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.653342" elapsed="0.029076"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:09.729107" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:09.683038" elapsed="0.046254"/>
</kw>
<msg time="2026-04-07T17:22:09.729469" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:09.729515" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.682582" elapsed="0.046970"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.729844" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.729629" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.729609" elapsed="0.000333"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.730482" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "M "o "d "i "f "i "e "d "[C "P "o "r "[78Ct "[A[78C
 "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.730116" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.730841" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.730633" elapsed="0.000281"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.730615" elapsed="0.000324"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:09.730988" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:09.733286" elapsed="0.000504"/>
</kw>
<kw name="Open 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-07T17:22:09.734717" elapsed="0.000608"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:09.736272" elapsed="0.000324"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.731806" elapsed="0.004861"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:09.731237" elapsed="0.005543"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:09.651400" elapsed="0.085479"/>
</kw>
<msg time="2026-04-07T17:22:09.736982" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.737029" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.650743" elapsed="0.086323"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:09.737250" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:09.737143" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.737125" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.737707" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.738084" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.738156" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:09.650081" elapsed="0.088182"/>
</kw>
<msg time="2026-04-07T17:22:09.738355" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:09.738398" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.645412" elapsed="0.093023"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.738756" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.738514" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:09.738497" elapsed="0.000336"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:09.645277" elapsed="0.093579"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:09.452611" elapsed="0.286275"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:09.450225" elapsed="0.288721"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:09.445699" elapsed="0.293343"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:09.445267" elapsed="0.293824"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:09.442567" elapsed="0.296582"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.745738" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:09.745380" elapsed="0.000385"/>
</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-07T17:22:09.755829" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:09.755446" elapsed="0.000410"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.756346" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:09.756028" elapsed="0.000344"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:09.756416" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:09.756569" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:09.755073" elapsed="0.001521"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.761875" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:09.761579" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:09.761947" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:22:09.762111" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:09.761234" elapsed="0.000903"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.768296" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.768034" elapsed="0.000308"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:09.768731" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:09.768490" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:09.777564" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:09.777730" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:09.777892" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:09.770900" elapsed="0.007451">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:09.768841" elapsed="0.009602">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.778630" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:09.778477" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:09.768823" elapsed="0.009896">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.779122" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.779258" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:09.779222" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:09.779205" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:09.779464" elapsed="0.000024"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.779535" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:09.762463" elapsed="0.017182">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:09.779705" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:09.760732" elapsed="0.019064">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:09.780044" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:09.756788" elapsed="0.023334">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:09.756650" elapsed="0.023546">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:09.754201" elapsed="0.026088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:10.799315" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:10.798823" elapsed="0.000526"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:10.799861" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:10.799518" elapsed="0.000369"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:10.799936" elapsed="0.000056"/>
</return>
<msg time="2026-04-07T17:22:10.800124" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:10.798428" elapsed="0.001721"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:10.805958" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:10.805518" elapsed="0.000500"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:10.806178" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:22:10.806398" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:10.805013" elapsed="0.001421"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:10.814938" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:10.814669" elapsed="0.000333"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:10.815400" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:10.815155" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:10.823144" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:10.823286" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:10.823392" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:10.817438" elapsed="0.006500">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:10.815525" elapsed="0.008559">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:10.824358" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:10.824135" elapsed="0.000319"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:10.815504" elapsed="0.008984">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:10.825057" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:10.825256" elapsed="0.000022"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:10.825200" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:10.825176" elapsed="0.000176"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:10.825557" elapsed="0.000031"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:10.825658" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:10.806925" elapsed="0.018885">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:10.825899" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:22:10.804321" elapsed="0.021736">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:10.826398" elapsed="0.000036"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:10.800352" elapsed="0.026160">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:10.800208" elapsed="0.026390">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:10.797585" elapsed="0.029214">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:11.842460" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:11.841818" elapsed="0.000685"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:11.843217" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:11.842733" elapsed="0.000522"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:11.843322" elapsed="0.000055"/>
</return>
<msg time="2026-04-07T17:22:11.843559" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:11.841280" elapsed="0.002315"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:11.848911" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:11.848611" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:11.848998" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:11.849147" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:11.848273" elapsed="0.000899"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:11.855777" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:11.855520" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:11.856234" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:11.855989" elapsed="0.000289"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:11.864820" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:11.865032" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:11.865173" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:11.858257" elapsed="0.007427">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:11.856351" elapsed="0.009447">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:11.866076" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:11.865845" elapsed="0.000323"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:11.856331" elapsed="0.009870">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:11.866703" elapsed="0.000035"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:11.866888" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:11.866837" elapsed="0.000111"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:11.866813" elapsed="0.000184"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:11.867277" elapsed="0.000032"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:11.867379" elapsed="0.000021"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:11.849506" elapsed="0.018023">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:11.867615" elapsed="0.000022"/>
</return>
<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="FAIL" start="2026-04-07T17:22:11.847774" elapsed="0.019974">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:11.868090" elapsed="0.000035"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:11.843838" elapsed="0.024363">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:11.843673" elapsed="0.024609">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:11.840195" elapsed="0.028215">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:12.884417" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:12.883897" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:12.884946" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:12.884628" elapsed="0.000358"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:12.885038" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:22:12.885221" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:12.883480" elapsed="0.001765"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:12.890543" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:12.890242" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:12.890616" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:12.890787" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:12.889880" elapsed="0.000931"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:12.897313" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:12.897054" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:12.897751" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:12.897508" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:12.906306" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:12.906453" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:12.906626" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:12.899782" elapsed="0.007267">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:12.897868" elapsed="0.009266">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:12.907324" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:12.907169" elapsed="0.000221"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:12.897847" elapsed="0.009568">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:12.907789" elapsed="0.000027"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:12.907924" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:12.907887" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:12.907871" elapsed="0.000136"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:12.908149" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:12.908219" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:12.891167" elapsed="0.017155">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:12.908384" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:12.889389" elapsed="0.019088">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:12.908713" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:12.885469" elapsed="0.023322">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:12.885309" elapsed="0.023541">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:12.882627" elapsed="0.026315">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:13.926417" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:13.925897" elapsed="0.000554"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:13.926943" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:13.926623" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:13.927038" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:22:13.927218" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:13.925506" elapsed="0.001737"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:13.932595" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:13.932294" elapsed="0.000330"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:13.932759" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:22:13.932915" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:13.931927" elapsed="0.001013"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:13.939383" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:13.939117" elapsed="0.000315"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:13.939831" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:13.939583" elapsed="0.000292"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:13.949354" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:13.949496" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:13.949602" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:13.941874" elapsed="0.008164">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:13.939949" elapsed="0.010175">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:13.950336" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:13.950179" elapsed="0.000224"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:13.939929" elapsed="0.010498">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:13.950797" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:13.950932" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:13.950895" elapsed="0.000095"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:13.950878" elapsed="0.000137"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:13.951157" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:13.951228" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:13.933300" elapsed="0.018034">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:13.951397" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:13.931410" elapsed="0.020082">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:13.951722" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:13.927450" elapsed="0.024350">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:13.927304" elapsed="0.024554">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:13.924684" elapsed="0.027317">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:14.969728" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:14.968944" elapsed="0.000837"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:14.970552" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:14.970045" elapsed="0.000539"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:14.970639" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:22:14.970825" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:14.968349" elapsed="0.002501"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:14.976411" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:14.976105" elapsed="0.000333"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:14.976484" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:14.976636" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:14.975737" elapsed="0.000929"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:14.983167" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:14.982895" elapsed="0.000321"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:14.983605" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:14.983364" elapsed="0.000284"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:14.992800" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:14.992944" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:14.993070" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:14.985604" elapsed="0.007854">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:14.983720" elapsed="0.009820">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:14.993749" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:14.993575" elapsed="0.000240"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:14.983700" elapsed="0.010139">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:14.994220" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:14.994353" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:14.994316" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:14.994299" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:14.994619" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:14.994690" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:14.977023" elapsed="0.017771">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:14.994856" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:14.975052" elapsed="0.019897">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:14.995194" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:14.971083" elapsed="0.024189">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:14.970912" elapsed="0.024418">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:14.967133" elapsed="0.028290">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:22:14.995522" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:22:09.745950" elapsed="5.249665">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:09.743397" elapsed="5.252332">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify modified port exists in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:09.442054" elapsed="5.553825">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s2-t30" name="Delete Port In New Owner After Recover" line="149">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:14.999347" elapsed="0.000289"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:14.998988" elapsed="0.000845"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.001210" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.001058" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.001032" elapsed="0.000270"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.007785" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.007637" elapsed="0.000210"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.007613" elapsed="0.000264"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.009304" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:15.008714" elapsed="0.000628"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.010053" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:15.009557" elapsed="0.000533"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:15.010151" elapsed="0.000039"/>
</return>
<msg time="2026-04-07T17:22:15.010412" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:15.008196" elapsed="0.002251"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.015825" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.015697" elapsed="0.000174"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.015673" elapsed="0.000220"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.017383" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.017257" elapsed="0.000179"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.017234" elapsed="0.000228"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.018101" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.017655" elapsed="0.000479"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.018651" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.018330" elapsed="0.000352"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.058618" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.019328" elapsed="0.039456"/>
</kw>
<msg time="2026-04-07T17:22:15.058959" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.059023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.018865" elapsed="0.040196"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.104453" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.059622" elapsed="0.045027"/>
</kw>
<msg time="2026-04-07T17:22:15.104816" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.104862" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.059228" elapsed="0.045671"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.105223" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.104998" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.104956" elapsed="0.000368"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.105862" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.105461" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.106245" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.106033" elapsed="0.000288"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.106015" elapsed="0.000331"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.106378" elapsed="0.000030"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.108721" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:22:15.110202" elapsed="0.002537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.113687" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.107250" elapsed="0.006862"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.106655" elapsed="0.007570"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.016853" elapsed="0.097472"/>
</kw>
<msg time="2026-04-07T17:22:15.114467" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.114511" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.016059" elapsed="0.098493"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.114739" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.114631" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.114613" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.115228" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.115555" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.115627" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.015341" elapsed="0.100392"/>
</kw>
<msg time="2026-04-07T17:22:15.115822" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.115865" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.010826" elapsed="0.105076"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.116325" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.116078" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.115959" elapsed="0.000445"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:15.010689" elapsed="0.105737"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.121500" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.121393" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.121375" elapsed="0.000201"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.122744" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.122638" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.122620" elapsed="0.000191"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.123329" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.122947" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.123764" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.123508" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.156048" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.124416" elapsed="0.031803"/>
</kw>
<msg time="2026-04-07T17:22:15.156387" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.156432" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.123941" elapsed="0.032527"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.224143" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.157090" elapsed="0.067245"/>
</kw>
<msg time="2026-04-07T17:22:15.224503" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.224551" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.156633" elapsed="0.067957"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.224882" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.224665" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.224646" elapsed="0.000389"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.225570" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.225177" elapsed="0.000480"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.225932" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.225723" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.225705" elapsed="0.000347"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.226085" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.228380" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.229859" elapsed="0.000488"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.231280" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.226914" elapsed="0.004763"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.226343" elapsed="0.005448"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.122343" elapsed="0.109546"/>
</kw>
<msg time="2026-04-07T17:22:15.231993" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.232039" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.121723" elapsed="0.110353"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.232258" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.232153" elapsed="0.000163"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.232134" elapsed="0.000206"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.232713" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.233229" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.233304" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.121054" elapsed="0.112357"/>
</kw>
<msg time="2026-04-07T17:22:15.233502" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.233556" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.116684" elapsed="0.116909"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.233908" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.233668" elapsed="0.000293"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.233650" elapsed="0.000351"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:15.116550" elapsed="0.117479"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.239283" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.239171" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.238956" elapsed="0.000394"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.240525" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.240420" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.240403" elapsed="0.000187"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.241097" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.240728" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.241539" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.241275" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.270381" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.242160" elapsed="0.028400"/>
</kw>
<msg time="2026-04-07T17:22:15.270736" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.270782" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.241753" elapsed="0.029065"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.339559" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.271386" elapsed="0.068763"/>
</kw>
<msg time="2026-04-07T17:22:15.340585" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.340689" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.271000" elapsed="0.069771"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.341607" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.341012" elapsed="0.000765"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.340916" elapsed="0.000918"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.343097" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "N "e "w "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.342171" elapsed="0.001121"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.343911" elapsed="0.000045"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.343442" elapsed="0.000672"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.343401" elapsed="0.000768"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.344242" elapsed="0.000067"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.347899" elapsed="0.000527"/>
</kw>
<kw name="Open 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-07T17:22:15.349408" elapsed="0.000504"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.350839" elapsed="0.000350"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.346263" elapsed="0.004997"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.344834" elapsed="0.006539"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.240124" elapsed="0.111349"/>
</kw>
<msg time="2026-04-07T17:22:15.351621" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.351668" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.239496" elapsed="0.112209"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.351891" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.351783" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.351764" elapsed="0.000225"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.352415" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.352755" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.352825" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.238639" elapsed="0.114294"/>
</kw>
<msg time="2026-04-07T17:22:15.353103" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.353147" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.234284" elapsed="0.118899"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.353524" elapsed="0.000025"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.353259" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.353242" elapsed="0.000365"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:15.234150" elapsed="0.119480"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:15.010518" elapsed="0.343145"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:15.007141" elapsed="0.346581"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:15.000634" elapsed="0.353145"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.000055" elapsed="0.353776"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:14.996850" elapsed="0.357036"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:15.365481" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:15.362002" elapsed="0.003520">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:14.996280" elapsed="0.369393">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t31" name="Delete Bridge In New Owner And Verify After Recover" line="153">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:15.369000" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:15.368726" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.370267" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.370158" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.370140" 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-07T17:22:15.374830" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.374726" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.374708" elapsed="0.000190"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.375900" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:15.375502" elapsed="0.000445"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.376422" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:15.376118" elapsed="0.000330"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:15.376491" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:15.376643" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:15.375132" elapsed="0.001536"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.382149" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.382041" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.382022" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.383402" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.383297" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.383279" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.383965" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.383606" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.384424" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.384163" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.425873" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.385039" elapsed="0.041024"/>
</kw>
<msg time="2026-04-07T17:22:15.426230" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.426276" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.384604" elapsed="0.041708"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.495343" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.426866" elapsed="0.068708"/>
</kw>
<msg time="2026-04-07T17:22:15.495760" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.495806" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.426479" elapsed="0.069364"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.496177" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.495930" elapsed="0.000327"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.495907" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.496810" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.496422" elapsed="0.000478"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.497192" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.496980" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.496948" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.497323" elapsed="0.000033"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.499703" elapsed="0.000544"/>
</kw>
<kw name="Open 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-07T17:22:15.501182" elapsed="0.000487"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.502599" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.498219" elapsed="0.004812"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.497613" elapsed="0.005534"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.382997" elapsed="0.120250"/>
</kw>
<msg time="2026-04-07T17:22:15.503339" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.503383" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.382362" elapsed="0.121059"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.503603" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.503497" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.503478" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.504084" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.504422" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.504494" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.381691" elapsed="0.122909"/>
</kw>
<msg time="2026-04-07T17:22:15.504690" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.504777" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.377053" elapsed="0.127764"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.505149" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.504891" elapsed="0.000311"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.504875" elapsed="0.000351"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:15.376894" elapsed="0.128355"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.510599" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.510491" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.510473" elapsed="0.000193"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.511901" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.511796" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.511778" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.512482" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.512134" elapsed="0.000374"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.512913" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.512659" elapsed="0.000279"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.545168" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.513499" elapsed="0.031830"/>
</kw>
<msg time="2026-04-07T17:22:15.545563" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.545609" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.513108" elapsed="0.032538"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.620798" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.546273" elapsed="0.074805"/>
</kw>
<msg time="2026-04-07T17:22:15.621290" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.621390" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.545836" elapsed="0.075613"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.622055" elapsed="0.000039"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.621569" elapsed="0.000618"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.621529" elapsed="0.000706"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.623151" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.622494" elapsed="0.000798"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.623705" elapsed="0.000032"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.623392" elapsed="0.000423"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.623365" elapsed="0.000487"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.623901" elapsed="0.000043"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.627392" elapsed="0.000760"/>
</kw>
<kw name="Open 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-07T17:22:15.629549" elapsed="0.000521"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.631002" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.625191" elapsed="0.006265"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.624320" elapsed="0.007257"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.511497" elapsed="0.120180"/>
</kw>
<msg time="2026-04-07T17:22:15.631769" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.631812" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.510812" elapsed="0.121038"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.632050" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.631927" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.631908" elapsed="0.000226"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.632519" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.632846" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.632917" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.510157" elapsed="0.122882"/>
</kw>
<msg time="2026-04-07T17:22:15.633134" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.633177" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.505516" elapsed="0.127698"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.633551" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.633289" elapsed="0.000317"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.633272" elapsed="0.000358"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:15.505371" elapsed="0.128284"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.639228" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.639114" elapsed="0.000160"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.638959" elapsed="0.000338"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.640504" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.640399" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.640381" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.641084" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.640709" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.641557" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.641262" elapsed="0.000321"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.674519" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.642134" elapsed="0.032547"/>
</kw>
<msg time="2026-04-07T17:22:15.674852" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.674899" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.641737" elapsed="0.033199"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.740640" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.675558" elapsed="0.065335"/>
</kw>
<msg time="2026-04-07T17:22:15.741101" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.741147" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.675171" elapsed="0.066117"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.741646" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.741390" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.741364" elapsed="0.000388"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.742305" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "N "e "[78Cw "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.741892" elapsed="0.000504"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.742674" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.742463" elapsed="0.000285"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.742445" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.742807" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.745180" elapsed="0.000523"/>
</kw>
<kw name="Open 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-07T17:22:15.746643" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.748054" elapsed="0.000323"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.743684" elapsed="0.004766"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.743099" elapsed="0.005465"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.640098" elapsed="0.108567"/>
</kw>
<msg time="2026-04-07T17:22:15.748758" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.748802" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.639445" elapsed="0.109395"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.749038" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.748916" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.748898" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.749525" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.749861" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.749932" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.638632" elapsed="0.111435"/>
</kw>
<msg time="2026-04-07T17:22:15.750161" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.750205" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.633917" elapsed="0.116326"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.750558" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.750317" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.750301" elapsed="0.000333"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:15.633782" elapsed="0.116876"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:15.376723" elapsed="0.373969"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:15.374371" elapsed="0.376381"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:15.369855" elapsed="0.380955"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.369409" elapsed="0.381449"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:15.366738" elapsed="0.384211"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:15.762613" level="FAIL">Variable '${new_owner}' not found.</msg>
<arg>${new_owner}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:15.759102" elapsed="0.003549">Variable '${new_owner}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:15.366137" elapsed="0.396662">Variable '${new_owner}' not found.</status>
</test>
<test id="s1-s2-s2-t32" name="Create Bridge In Old Candidate and Verify After Recover" 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-07T17:22:15.766059" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:15.765784" elapsed="0.000539"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.767286" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.767178" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.767160" 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-07T17:22:15.771886" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.771781" elapsed="0.000149"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.771763" elapsed="0.000189"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.772938" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:15.772559" elapsed="0.000405"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.773453" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:15.773138" elapsed="0.000341"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:15.773523" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:15.773676" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:15.772188" elapsed="0.001512"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.778940" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.778832" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.778813" elapsed="0.000211"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.780205" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.780100" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.780082" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.780767" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.780409" elapsed="0.000384"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.781223" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.780945" elapsed="0.000312"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.810342" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.781789" elapsed="0.028729"/>
</kw>
<msg time="2026-04-07T17:22:15.810683" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.810730" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.781413" elapsed="0.029353"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.882222" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.811380" elapsed="0.071508"/>
</kw>
<msg time="2026-04-07T17:22:15.883355" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:15.883460" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.810932" elapsed="0.072612"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.884359" elapsed="0.000050"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.883811" elapsed="0.000721"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.883765" elapsed="0.000826"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:15.885733" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:15.884899" elapsed="0.000929"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.886142" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.885896" elapsed="0.000323"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.885878" elapsed="0.000366"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:15.886278" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:15.888850" elapsed="0.000554"/>
</kw>
<kw name="Open 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-07T17:22:15.890344" elapsed="0.000497"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:15.891796" elapsed="0.000359"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:15.887165" elapsed="0.005063"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:15.886542" elapsed="0.005803"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.779778" elapsed="0.112670"/>
</kw>
<msg time="2026-04-07T17:22:15.892542" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.892586" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.779172" elapsed="0.113453"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:15.892810" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:15.892701" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.892682" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.893319" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.893652" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.893722" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.778497" elapsed="0.115334"/>
</kw>
<msg time="2026-04-07T17:22:15.893925" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:15.893983" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.774083" elapsed="0.119941"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:15.894345" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:15.894100" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.894083" elapsed="0.000339"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:15.773929" elapsed="0.120516"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.899817" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.899709" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.899690" elapsed="0.000196"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:15.901284" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:15.901157" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:15.901139" elapsed="0.000214"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:15.901854" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:15.901495" elapsed="0.000421"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.902361" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:15.902094" elapsed="0.000294"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:15.935512" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:15.902998" elapsed="0.032691"/>
</kw>
<msg time="2026-04-07T17:22:15.935857" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:15.935904" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.902548" elapsed="0.033393"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.003294" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:15.936560" elapsed="0.067080"/>
</kw>
<msg time="2026-04-07T17:22:16.003890" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.003938" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.936125" elapsed="0.067868"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.004472" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.004117" elapsed="0.000436"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.004080" elapsed="0.000503"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.005243" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.004727" elapsed="0.000614"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.005662" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.005410" elapsed="0.000332"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.005390" elapsed="0.000378"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.005807" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.008540" elapsed="0.000543"/>
</kw>
<kw name="Open 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-07T17:22:16.010102" elapsed="0.000500"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.011520" elapsed="0.000328"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.006950" elapsed="0.004970"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.006151" elapsed="0.005899"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:15.900831" elapsed="0.111333"/>
</kw>
<msg time="2026-04-07T17:22:16.012267" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.012313" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.900214" elapsed="0.112137"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.012541" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.012432" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.012412" elapsed="0.000214"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.013064" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.013444" elapsed="0.000098"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.013594" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:15.899364" elapsed="0.114345"/>
</kw>
<msg time="2026-04-07T17:22:16.013805" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.013849" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.894739" elapsed="0.119148"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.014241" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.013989" elapsed="0.000307"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.013946" elapsed="0.000373"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:15.894568" elapsed="0.119776"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.019818" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.019710" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.019691" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.021081" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.020957" elapsed="0.000193"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.020939" elapsed="0.000235"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.021674" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.021315" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.022163" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.021853" elapsed="0.000337"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.052577" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.022729" elapsed="0.030013"/>
</kw>
<msg time="2026-04-07T17:22:16.052912" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.052958" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.022345" elapsed="0.030667"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.120237" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.053604" elapsed="0.066849"/>
</kw>
<msg time="2026-04-07T17:22:16.120631" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.120678" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.053208" elapsed="0.067507"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.121051" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.120797" elapsed="0.000359"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.120775" elapsed="0.000407"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.121711" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "C "a "n "d "i "d "a "t "e "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.121327" elapsed="0.000476"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.122108" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.121871" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.121853" elapsed="0.000358"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.122243" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.124674" elapsed="0.000545"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.126158" elapsed="0.000475"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.127548" elapsed="0.000325"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.123170" elapsed="0.004775"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.122506" elapsed="0.005571"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.020656" elapsed="0.107524"/>
</kw>
<msg time="2026-04-07T17:22:16.128272" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.128315" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.020047" elapsed="0.108306"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.128540" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.128431" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.128412" elapsed="0.000213"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.129034" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.129378" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.129449" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.019363" elapsed="0.110197"/>
</kw>
<msg time="2026-04-07T17:22:16.129655" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.129698" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.014617" elapsed="0.115118"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.130087" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.129810" elapsed="0.000333"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.129793" elapsed="0.000373"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:16.014479" elapsed="0.115711"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:15.773756" elapsed="0.356464"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:15.771426" elapsed="0.358854"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:15.766876" elapsed="0.363463"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:15.766468" elapsed="0.363920"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:15.763790" elapsed="0.366655"/>
</kw>
<kw name="Create Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:16.142441" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Create bridge br01 in controller ${controller_index} and verify it gets created in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.138614" elapsed="0.003866">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Create Bridge in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:15.763184" elapsed="0.379451">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t33" name="Create Port In Old Owner and Verify After Recover" 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-07T17:22:16.146600" elapsed="0.000213"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:16.146334" 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-07T17:22:16.147851" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.147740" elapsed="0.000157"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.147721" 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-07T17:22:16.152491" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.152384" elapsed="0.000191"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.152366" elapsed="0.000234"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.153621" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:16.153234" elapsed="0.000414"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.154130" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:16.153807" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:16.154200" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:16.154355" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:16.152826" elapsed="0.001553"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.159597" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.159487" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.159468" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.160907" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.160800" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.160782" elapsed="0.000215"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.161507" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.161147" elapsed="0.000386"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.161945" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.161688" elapsed="0.000299"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.195075" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.162524" elapsed="0.032863"/>
</kw>
<msg time="2026-04-07T17:22:16.195711" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.195776" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.162143" elapsed="0.033685"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.261782" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.196912" elapsed="0.065255"/>
</kw>
<msg time="2026-04-07T17:22:16.262431" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.262481" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.196204" elapsed="0.066315"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.263059" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.262657" elapsed="0.000488"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.262612" elapsed="0.000563"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.263842" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.263323" elapsed="0.000615"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.264243" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.264027" elapsed="0.000292"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.264007" elapsed="0.000336"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.264382" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.266956" elapsed="0.000552"/>
</kw>
<kw name="Open 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-07T17:22:16.268602" elapsed="0.000544"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.270084" elapsed="0.000336"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.265413" elapsed="0.005081"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.264733" elapsed="0.005881"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.160463" elapsed="0.110254"/>
</kw>
<msg time="2026-04-07T17:22:16.270813" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.270858" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.159813" elapsed="0.111084"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.271114" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.271003" elapsed="0.000170"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.270957" elapsed="0.000241"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.271614" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.271959" elapsed="0.000132"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.272140" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.159149" elapsed="0.113104"/>
</kw>
<msg time="2026-04-07T17:22:16.272353" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.272397" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.154751" elapsed="0.117683"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.272765" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.272514" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.272496" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:16.154611" elapsed="0.118255"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.280355" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.280246" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.280227" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.281626" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.281518" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.281500" elapsed="0.000193"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.282213" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.281832" elapsed="0.000407"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.282656" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.282394" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.313681" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.283230" elapsed="0.030666"/>
</kw>
<msg time="2026-04-07T17:22:16.314202" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.314249" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.282834" elapsed="0.031452"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.382768" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.314993" elapsed="0.068210"/>
</kw>
<msg time="2026-04-07T17:22:16.383458" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.383527" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.314508" elapsed="0.069075"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.384093" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.383719" elapsed="0.000486"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.383680" elapsed="0.000565"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.385053" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.384448" elapsed="0.000738"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.385591" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.385284" elapsed="0.000387"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.385257" elapsed="0.000439"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.385733" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.388194" elapsed="0.000624"/>
</kw>
<kw name="Open 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-07T17:22:16.389745" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.391162" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.386672" elapsed="0.004890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.386064" elapsed="0.005612"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.281216" elapsed="0.110562"/>
</kw>
<msg time="2026-04-07T17:22:16.391872" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.391916" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.280567" elapsed="0.111386"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.392155" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.392048" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.392027" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.392643" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.393018" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.393091" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.279886" elapsed="0.113316"/>
</kw>
<msg time="2026-04-07T17:22:16.393547" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.393601" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.273189" elapsed="0.120452"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.393989" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.393723" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.393705" elapsed="0.000363"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:16.273046" elapsed="0.121047"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.399624" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.399516" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.399498" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.401022" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.400849" elapsed="0.000222"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.400832" elapsed="0.000261"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.401599" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.401234" elapsed="0.000392"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.402294" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.401777" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.435309" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.402857" elapsed="0.032744"/>
</kw>
<msg time="2026-04-07T17:22:16.435875" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.435922" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.402477" elapsed="0.033483"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.505950" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.436836" elapsed="0.069350"/>
</kw>
<msg time="2026-04-07T17:22:16.506353" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.506398" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.436273" elapsed="0.070162"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.506808" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.506544" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.506510" elapsed="0.000405"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.507491" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "r "e "a "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "a "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.507102" elapsed="0.000487"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.507867" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.507657" elapsed="0.000284"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.507639" elapsed="0.000343"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.508025" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.510640" elapsed="0.000536"/>
</kw>
<kw name="Open 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-07T17:22:16.512132" elapsed="0.000509"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.513583" elapsed="0.000333"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.509059" elapsed="0.004944"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.508369" elapsed="0.005753"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.400545" elapsed="0.113683"/>
</kw>
<msg time="2026-04-07T17:22:16.514327" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.514372" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.399895" elapsed="0.114514"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.514596" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.514489" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.514469" elapsed="0.000211"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.515181" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.515525" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.515595" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.399167" elapsed="0.116540"/>
</kw>
<msg time="2026-04-07T17:22:16.515804" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.515849" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.394371" elapsed="0.121515"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.516245" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.515963" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.515946" elapsed="0.000377"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:16.394233" elapsed="0.122115"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:16.154435" elapsed="0.361952"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:16.152027" elapsed="0.364426"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:16.147450" elapsed="0.369067"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.147031" elapsed="0.369536"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:16.143854" elapsed="0.372771"/>
</kw>
<kw name="Create Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:16.528678" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Add Port vx2 to bridge br01 in controller ${controller_index} and verify it gets added in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.524871" elapsed="0.003847">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Create Port in Owner and verify it gets applied from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.143159" elapsed="0.385742">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t34" name="Modify the destination IP of Port In Old Owner After Recover" 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-07T17:22:16.532178" elapsed="0.000208"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:16.531905" 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-07T17:22:16.533456" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.533348" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.533329" 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-07T17:22:16.538053" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.537932" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.537914" elapsed="0.000206"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.539106" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:16.538709" elapsed="0.000424"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.539640" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:16.539318" elapsed="0.000348"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:16.539710" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:16.539862" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:16.538340" elapsed="0.001546"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.545294" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.545187" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.545167" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.546612" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.546471" elapsed="0.000189"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.546453" elapsed="0.000229"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.547205" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.546823" elapsed="0.000408"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.547645" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.547384" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.588639" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.548222" elapsed="0.040581"/>
</kw>
<msg time="2026-04-07T17:22:16.589022" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.589069" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.547826" elapsed="0.041280"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.667545" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.589658" elapsed="0.078109"/>
</kw>
<msg time="2026-04-07T17:22:16.667947" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.668015" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.589273" elapsed="0.078781"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.668389" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.668151" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.668117" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.669083" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.668640" elapsed="0.000538"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.669456" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.669246" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.669228" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.669589" elapsed="0.000031"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.671932" elapsed="0.000530"/>
</kw>
<kw name="Open 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-07T17:22:16.673437" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.674944" elapsed="0.000347"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.670473" elapsed="0.004890"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.669869" elapsed="0.005610"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.546170" elapsed="0.129408"/>
</kw>
<msg time="2026-04-07T17:22:16.675669" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.675713" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.545516" elapsed="0.130235"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.675933" elapsed="0.000029"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.675828" elapsed="0.000184"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.675809" elapsed="0.000228"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.676431" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.676834" elapsed="0.000026"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.676908" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.544799" elapsed="0.132244"/>
</kw>
<msg time="2026-04-07T17:22:16.677147" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.677217" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.540312" elapsed="0.136952"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.677612" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.677359" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.677339" elapsed="0.000353"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:16.540172" elapsed="0.137544"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.683496" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.683385" elapsed="0.000162"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.683366" elapsed="0.000205"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.684782" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.684676" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.684655" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.685415" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.685050" elapsed="0.000391"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.685855" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.685594" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.715684" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.686435" elapsed="0.029424"/>
</kw>
<msg time="2026-04-07T17:22:16.716064" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.716111" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.686052" elapsed="0.030095"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.787335" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.716704" elapsed="0.070895"/>
</kw>
<msg time="2026-04-07T17:22:16.787815" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.787863" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.716316" elapsed="0.071586"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.788333" elapsed="0.000026"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.788039" elapsed="0.000376"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.788004" elapsed="0.000440"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.789087" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.788595" elapsed="0.000591"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.789469" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.789255" elapsed="0.000352"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.789236" elapsed="0.000396"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.789669" elapsed="0.000038"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.792173" elapsed="0.000514"/>
</kw>
<kw name="Open 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-07T17:22:16.793634" elapsed="0.000599"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.795216" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.790654" elapsed="0.004961"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.790007" elapsed="0.005725"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.684370" elapsed="0.111470"/>
</kw>
<msg time="2026-04-07T17:22:16.795936" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.796011" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.683718" elapsed="0.112333"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.796239" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.796131" elapsed="0.000167"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.796112" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.796730" elapsed="0.000043"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.797120" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.797193" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.682991" elapsed="0.114312"/>
</kw>
<msg time="2026-04-07T17:22:16.797399" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.797444" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.678023" elapsed="0.119458"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.797802" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.797558" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.797540" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:16.677860" elapsed="0.120043"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.803657" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.803549" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.803530" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.805003" elapsed="0.000017"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.804870" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.804851" elapsed="0.000222"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.805591" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.805213" elapsed="0.000404"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.806046" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.805768" elapsed="0.000305"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.835218" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.806605" elapsed="0.028789"/>
</kw>
<msg time="2026-04-07T17:22:16.835561" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.835606" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.806227" elapsed="0.029416"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.911198" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.836265" elapsed="0.075293"/>
</kw>
<msg time="2026-04-07T17:22:16.911827" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:16.911874" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.835859" elapsed="0.076052"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.912433" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.912068" elapsed="0.000450"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.912025" elapsed="0.000522"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.913239" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "M "o "d "i "f "y "[C "t "h "e "[C "d "e "s "t "i "n "a "t "[78Ci "[A[78Co
 "n "[C "I "P "[C "o "f "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "O "w "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:16.912712" elapsed="0.000624"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.913613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.913403" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.913385" elapsed="0.000328"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:16.913751" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:16.916336" elapsed="0.000559"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.917862" elapsed="0.000537"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:16.919339" elapsed="0.000337"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:16.914776" elapsed="0.004974"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:16.914120" elapsed="0.005747"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.804541" elapsed="0.115442"/>
</kw>
<msg time="2026-04-07T17:22:16.920086" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.920131" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.803872" elapsed="0.116297"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:16.920356" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:16.920249" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.920230" elapsed="0.000210"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.920876" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.921239" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.921313" elapsed="0.000018"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.803202" elapsed="0.118225"/>
</kw>
<msg time="2026-04-07T17:22:16.921528" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:16.921572" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.798219" elapsed="0.123397"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:16.921944" elapsed="0.000114"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:16.921695" elapsed="0.000399"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.921678" elapsed="0.000441"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:16.798080" elapsed="0.124065"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:16.539964" elapsed="0.382219"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:16.537578" elapsed="0.384671"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:16.533052" elapsed="0.389258"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.532580" elapsed="0.389781"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:16.529920" elapsed="0.392499"/>
</kw>
<kw name="Modify the destination IP of Sample Port" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:16.930965" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Modify the dst ip of port vx2 in bridge br01 in controller ${controller_index}.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.927072" elapsed="0.003945">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Modify the dst ip of existing port in Owner.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.529319" elapsed="0.401862">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t35" name="Verify Port Is Modified After Recover" 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-07T17:22:16.934449" elapsed="0.000230"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:16.934190" elapsed="0.000544"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.935751" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.935632" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.935612" 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-07T17:22:16.940401" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.940294" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.940276" elapsed="0.000193"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.941522" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:16.941126" elapsed="0.000422"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:16.942028" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:16.941704" elapsed="0.000349"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:16.942097" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:22:16.942255" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:16.940730" elapsed="0.001549"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.947531" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.947424" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.947406" elapsed="0.000192"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:16.948828" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:16.948721" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:16.948702" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:16.949429" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:16.949060" elapsed="0.000395"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.949873" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:16.949611" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:16.984434" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:16.950449" elapsed="0.034166"/>
</kw>
<msg time="2026-04-07T17:22:16.984821" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:16.984866" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.950071" elapsed="0.034832"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.041987" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:16.985594" elapsed="0.056582"/>
</kw>
<msg time="2026-04-07T17:22:17.042343" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:17.042388" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.985199" elapsed="0.057225"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.042724" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.042501" elapsed="0.000299"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.042482" elapsed="0.000343"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.043357" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:17.042984" elapsed="0.000459"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.043718" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.043509" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.043491" elapsed="0.000325"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:17.043849" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:17.046217" elapsed="0.000512"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:17.047642" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:17.049073" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:17.044761" elapsed="0.004704"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:17.044148" elapsed="0.005432"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:16.948401" elapsed="0.101285"/>
</kw>
<msg time="2026-04-07T17:22:17.049782" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.049827" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.947745" elapsed="0.102119"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:17.050073" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:17.049946" elapsed="0.000188"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.049926" elapsed="0.000232"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.050570" elapsed="0.000028"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.050916" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.051003" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:16.947088" elapsed="0.104026"/>
</kw>
<msg time="2026-04-07T17:22:17.051208" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.051252" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.942667" elapsed="0.108623"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.051617" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.051366" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.051349" elapsed="0.000346"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:16.942527" elapsed="0.109237"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.057403" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:17.057294" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.057275" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.058649" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:17.058546" elapsed="0.000148"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.058528" elapsed="0.000188"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:17.059256" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:17.058853" elapsed="0.000430"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.059697" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:17.059437" elapsed="0.000285"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.091079" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:17.060270" elapsed="0.030971"/>
</kw>
<msg time="2026-04-07T17:22:17.091410" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:17.091455" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.059874" elapsed="0.031618"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.144303" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:17.092054" elapsed="0.052444"/>
</kw>
<msg time="2026-04-07T17:22:17.144694" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:17.144739" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.091655" elapsed="0.053120"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.145092" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.144851" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.144832" elapsed="0.000363"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.145712" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:17.145336" elapsed="0.000461"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.146090" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.145863" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.145845" elapsed="0.000346"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:17.146223" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:17.148518" elapsed="0.000560"/>
</kw>
<kw name="Open 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-07T17:22:17.150025" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:17.151426" elapsed="0.000326"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:17.147084" elapsed="0.004738"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:17.146494" elapsed="0.005446"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:17.058250" elapsed="0.093804"/>
</kw>
<msg time="2026-04-07T17:22:17.152145" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.152188" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.057615" elapsed="0.094610"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:17.152450" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:17.152343" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.152323" elapsed="0.000209"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.152926" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.153277" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.153347" elapsed="0.000017"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:17.056723" elapsed="0.096732"/>
</kw>
<msg time="2026-04-07T17:22:17.153547" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.153589" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.052056" elapsed="0.101571"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.153943" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.153701" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.153684" elapsed="0.000369"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:17.051901" elapsed="0.102175"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.159479" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:17.159369" elapsed="0.000156"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.159349" elapsed="0.000198"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.160820" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:17.160714" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.160696" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:17.161402" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:17.161047" elapsed="0.000382"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.161840" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:17.161580" elapsed="0.000286"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.192618" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:17.162416" elapsed="0.030376"/>
</kw>
<msg time="2026-04-07T17:22:17.192957" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:17.193023" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.162037" elapsed="0.031023"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:17.248819" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:17.193609" elapsed="0.055424"/>
</kw>
<msg time="2026-04-07T17:22:17.249201" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:17.249246" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.193224" elapsed="0.056058"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.249572" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.249357" elapsed="0.000289"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.249338" elapsed="0.000336"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.250211" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "V "e "r "i "f "y "[C "P "o "r "t "[C "I "s "[C "M "o "d "i "[78Cf "[A[78Ci
 "e "d "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:17.249813" elapsed="0.000521"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.250613" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.250402" elapsed="0.000286"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.250384" elapsed="0.000329"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:17.250746" elapsed="0.000027"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:17.253160" elapsed="0.000537"/>
</kw>
<kw name="Open 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-07T17:22:17.254632" elapsed="0.000496"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:17.256052" elapsed="0.000321"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:17.251577" elapsed="0.004867"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:17.251011" elapsed="0.005564"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:17.160383" elapsed="0.096301"/>
</kw>
<msg time="2026-04-07T17:22:17.256775" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.256818" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.159699" elapsed="0.097157"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:17.257054" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:17.256932" elapsed="0.000180"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.256913" elapsed="0.000223"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.257517" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.257858" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.257930" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:17.158998" elapsed="0.099080"/>
</kw>
<msg time="2026-04-07T17:22:17.258175" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:17.258220" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:17.154335" elapsed="0.103921"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.258581" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.258332" elapsed="0.000302"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:17.258314" elapsed="0.000347"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:17.154199" elapsed="0.104486"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:16.942343" elapsed="0.316374"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:16.939919" elapsed="0.318858"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:16.935333" elapsed="0.323503"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:16.934882" elapsed="0.324003"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:16.932155" elapsed="0.326787"/>
</kw>
<kw name="Verify Sample Port Is Modified" owner="ClusterOvsdb">
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.265776" level="INFO">${port_dictionary} = {'br01': '6', 'vx2': '3', '10.0.0.19': '1'}</msg>
<var>${port_dictionary}</var>
<arg>br01=6</arg>
<arg>vx2=3</arg>
<arg>10.0.0.19=1</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:17.265399" elapsed="0.000404"/>
</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-07T17:22:17.275488" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:17.275106" elapsed="0.000409"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.276059" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:17.275728" elapsed="0.000357"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:17.276130" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:22:17.276286" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:17.274725" elapsed="0.001585"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.281684" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:17.281387" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:17.281755" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:17.281901" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:17.281001" elapsed="0.000924"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.288050" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:17.287786" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:17.288482" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:17.288244" elapsed="0.000309"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:17.304949" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:17.305197" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:17.305379" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:17.290659" elapsed="0.015336">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:17.288628" elapsed="0.017502">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.306439" elapsed="0.000033"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:17.306185" elapsed="0.000350"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:17.288608" elapsed="0.017962">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.307171" elapsed="0.000039"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.307372" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:17.307317" elapsed="0.000119"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:17.307291" elapsed="0.000177"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:17.307673" elapsed="0.000030"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.307773" elapsed="0.000022"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:17.282270" elapsed="0.025664">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:17.308042" elapsed="0.000023"/>
</return>
<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="FAIL" start="2026-04-07T17:22:17.280483" elapsed="0.027701">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:17.308634" elapsed="0.000037"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:17.276505" elapsed="0.032245">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:17.276366" elapsed="0.032476">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:17.274080" elapsed="0.034922">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:18.327585" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:18.327083" elapsed="0.000537"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:18.328131" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:18.327792" elapsed="0.000365"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:18.328207" elapsed="0.000047"/>
</return>
<msg time="2026-04-07T17:22:18.328395" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:18.326678" elapsed="0.001741"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:18.333713" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:18.333408" elapsed="0.000331"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:18.333785" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:18.333930" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:18.333067" elapsed="0.000887"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:18.341808" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:18.341548" elapsed="0.000307"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:18.342263" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:18.342020" elapsed="0.000286"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:18.351616" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:18.351768" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:18.351884" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:18.344293" elapsed="0.008020">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:18.342382" elapsed="0.010016">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:18.352588" elapsed="0.000080"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:18.352433" elapsed="0.000281"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:18.342360" elapsed="0.010378">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:18.353126" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:18.353259" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:18.353223" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:18.353206" elapsed="0.000116"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:18.353460" elapsed="0.000020"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:18.353528" elapsed="0.000014"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:18.334312" elapsed="0.019320">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:18.353696" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:18.332571" elapsed="0.021216">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:18.354029" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:18.328634" elapsed="0.025471">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:18.328483" elapsed="0.025683">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:18.325828" elapsed="0.028429">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:19.372628" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:19.372091" elapsed="0.000574"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:19.373178" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:19.372843" elapsed="0.000361"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:19.373254" elapsed="0.000053"/>
</return>
<msg time="2026-04-07T17:22:19.373446" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:19.371664" elapsed="0.001806"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:19.378800" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:19.378501" elapsed="0.000326"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:19.378873" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:19.379035" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:19.378158" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:19.385601" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:19.385342" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:19.386072" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:19.385798" elapsed="0.000318"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:19.395307" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:19.395471" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:19.395610" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:19.388227" elapsed="0.007815">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:19.386299" elapsed="0.009831">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:19.396317" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:19.396165" elapsed="0.000218"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:19.386275" elapsed="0.010131">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:19.396782" elapsed="0.000025"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:19.396915" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:19.396878" elapsed="0.000079"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:19.396861" elapsed="0.000134"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:19.397137" elapsed="0.000021"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:19.397206" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:19.379417" elapsed="0.017896">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:19.397386" elapsed="0.000016"/>
</return>
<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="FAIL" start="2026-04-07T17:22:19.377659" elapsed="0.019822">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:19.397711" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:19.373695" elapsed="0.024093">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:19.373538" elapsed="0.024309">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:19.370699" elapsed="0.027240">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:20.413686" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:20.413078" elapsed="0.000649"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:20.414525" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:20.414087" elapsed="0.000474"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:20.414627" elapsed="0.000051"/>
</return>
<msg time="2026-04-07T17:22:20.414861" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:20.412515" elapsed="0.002379"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:20.420526" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:20.420228" elapsed="0.000324"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:20.420597" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:20.420744" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:20.419871" elapsed="0.000897"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:20.427305" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:20.427047" elapsed="0.000305"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:20.427753" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:20.427503" elapsed="0.000293"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:20.436319" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:20.436456" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:20.436559" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:20.429769" elapsed="0.007273">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:20.427868" elapsed="0.009288">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:20.437412" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:20.437203" elapsed="0.000300"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:20.427848" elapsed="0.009688">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:20.438069" elapsed="0.000036"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:20.438257" elapsed="0.000019"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:20.438206" elapsed="0.000109"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:20.438182" elapsed="0.000163"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:20.438540" elapsed="0.000029"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:20.438636" elapsed="0.000020"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:20.421251" elapsed="0.017529">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:20.438864" elapsed="0.000063"/>
</return>
<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="FAIL" start="2026-04-07T17:22:20.419389" elapsed="0.019689">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:20.439404" elapsed="0.000034"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:20.415235" elapsed="0.024278">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:20.415025" elapsed="0.024569">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:20.411275" elapsed="0.028447">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:21.453267" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:21.452614" elapsed="0.000695"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:21.453988" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:21.453534" elapsed="0.000492"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:21.454094" elapsed="0.000049"/>
</return>
<msg time="2026-04-07T17:22:21.454324" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:21.452063" elapsed="0.002295"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:21.459861" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:21.459560" elapsed="0.000328"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:21.459935" elapsed="0.000042"/>
</return>
<msg time="2026-04-07T17:22:21.460100" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:21.459218" elapsed="0.000907"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:21.466644" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:21.466367" elapsed="0.000325"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:21.467104" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:21.466843" elapsed="0.000307"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:21.475253" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:21.475393" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:21.475497" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:21.469196" elapsed="0.006684">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:21.467223" elapsed="0.008757">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:21.476218" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:21.476063" elapsed="0.000220"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:21.467203" elapsed="0.009104">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:21.476680" elapsed="0.000026"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:21.476818" elapsed="0.000013"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:21.476782" elapsed="0.000077"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:21.476764" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:21.477035" elapsed="0.000023"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:21.477107" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:21.460466" elapsed="0.016745">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:21.477271" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:21.458711" elapsed="0.018653">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:21.477590" elapsed="0.000025"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:21.454667" elapsed="0.023000">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:21.454435" elapsed="0.023289">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:21.451051" elapsed="0.026764">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<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-07T17:22:22.493133" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:22.492507" elapsed="0.000667"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.493817" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:22.493395" elapsed="0.000458"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:22.493915" elapsed="0.000090"/>
</return>
<msg time="2026-04-07T17:22:22.494193" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:22.491957" elapsed="0.002270"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.499872" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:22.499572" elapsed="0.000327"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:22.499945" elapsed="0.000043"/>
</return>
<msg time="2026-04-07T17:22:22.500109" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:22.499232" elapsed="0.000901"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.506498" level="INFO">/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.506240" elapsed="0.000304"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.506939" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.506694" elapsed="0.000363"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:22.515080" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:22.515202" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig 
 status=409, reason=Conflict 
 headers={'Content-Type': 'application/yang-data+json', 'Content-Length': '242'} 
 body={
  "errors": {
    "error": [
      {
        "error-tag": "data-missing",
        "error-message": "Request could not be completed because the relevant data model content does not exist",
        "error-type": "protocol"
      }
    ]
  }
} 
 </msg>
<msg time="2026-04-07T17:22:22.515298" level="FAIL">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.509020" elapsed="0.006632">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<status status="FAIL" start="2026-04-07T17:22:22.507130" elapsed="0.008603">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.515921" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.515771" elapsed="0.000233"/>
</branch>
<status status="FAIL" start="2026-04-07T17:22:22.507111" elapsed="0.008917">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.516416" elapsed="0.000028"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.516552" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.516515" elapsed="0.000078"/>
</branch>
<status status="NOT RUN" start="2026-04-07T17:22:22.516498" elapsed="0.000117"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.516755" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.516825" elapsed="0.000015"/>
</return>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.500471" elapsed="0.016457">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<return>
<value>${response_text}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.517005" elapsed="0.000015"/>
</return>
<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="FAIL" start="2026-04-07T17:22:22.498727" elapsed="0.018373">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</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-07T17:22:22.517327" elapsed="0.000024"/>
</kw>
<var name="${index}">1</var>
<status status="FAIL" start="2026-04-07T17:22:22.494500" elapsed="0.022904">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="FAIL" start="2026-04-07T17:22:22.494308" elapsed="0.023154">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</for>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_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 ${dictionary}.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.490915" elapsed="0.026637">HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<msg time="2026-04-07T17:22:22.517648" level="FAIL">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</msg>
<arg>5s</arg>
<arg>1s</arg>
<arg>ClusterManagement.Check_Item_Occurrence_Member_List_Or_All</arg>
<arg>uri=${RFC8040_SOUTHBOUND_NODE_API}uuid%2F${ovsdb_uuid}%2Fbridge%2F${BRIDGE}?${RFC8040_OPERATIONAL_CONTENT}</arg>
<arg>dictionary=${port_dictionary}</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-07T17:22:17.266003" elapsed="5.251779">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify dst ip of port vx2 in bridge br01 gets modified in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:17.263402" elapsed="5.254494">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</kw>
<doc>Verify port is modified in all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:16.931578" elapsed="5.586503">Keyword 'ClusterManagement.Check_Item_Occurrence_Member_List_Or_All' failed after retrying for 5 seconds. The last error was: HTTPError: 409 Client Error: Conflict for url: http://10.30.170.175:8181/rests/data/network-topology:network-topology/topology=ovsdb%3A1/node=ovsdb%3A%2F%2Fuuid%2Fe28f74da-cb36-4e4b-95a3-49cc2a0e6630%2Fbridge%2Fbr01?content=nonconfig</status>
</test>
<test id="s1-s2-s2-t36" name="Delete Port In Old Owner After Recover" line="173">
<kw name="Setup_Test_With_Logging_And_Without_Fast_Failing" owner="SetupUtils" type="SETUP">
<kw name="Run_Even_When_Failing_Fast" owner="FailFast">
<kw name="No Operation" owner="BuiltIn">
<doc>Does absolutely nothing.</doc>
<status status="PASS" start="2026-04-07T17:22:22.521598" elapsed="0.000210"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:22.521334" 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-07T17:22:22.522948" elapsed="0.000042"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.522794" elapsed="0.000242"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.522766" elapsed="0.000301"/>
</if>
<kw name="Log_Message_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.529756" elapsed="0.000020"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.529606" elapsed="0.000213"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.529579" elapsed="0.000272"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.531240" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:22.530826" elapsed="0.000441"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.531722" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:22.531422" elapsed="0.000325"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:22.531792" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:22.531944" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:22.530318" elapsed="0.001666"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.537040" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.536916" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.536898" elapsed="0.000209"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.538364" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.538258" elapsed="0.000150"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.538240" elapsed="0.000190"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:22.538946" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.538571" elapsed="0.000418"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.539411" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:22.539147" elapsed="0.000290"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.567573" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:22.539986" elapsed="0.027751"/>
</kw>
<msg time="2026-04-07T17:22:22.567910" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:22.567956" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.539592" elapsed="0.028422"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.621279" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:22.568578" elapsed="0.053219"/>
</kw>
<msg time="2026-04-07T17:22:22.622398" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:22.622452" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.568185" elapsed="0.054318"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.623074" elapsed="0.000030"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.622661" elapsed="0.000499"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.622610" elapsed="0.000582"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.623858" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.623339" elapsed="0.000612"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.624255" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.624039" elapsed="0.000290"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.624019" elapsed="0.000335"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:22.624392" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:22.626962" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:22:22.628606" elapsed="0.000843"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:22.630479" elapsed="0.000332"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:22.625406" elapsed="0.005480"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:22.624737" elapsed="0.006301"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:22.537909" elapsed="0.093262"/>
</kw>
<msg time="2026-04-07T17:22:22.631280" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.631325" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.537253" elapsed="0.094108"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:22.631554" elapsed="0.000030"/>
</return>
<status status="PASS" start="2026-04-07T17:22:22.631442" elapsed="0.000177"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.631422" elapsed="0.000221"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.632097" elapsed="0.000027"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.632465" elapsed="0.000032"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.632559" elapsed="0.000020"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:22.536577" elapsed="0.096112"/>
</kw>
<msg time="2026-04-07T17:22:22.632798" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.632853" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.532340" elapsed="0.100560"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.633320" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.633010" elapsed="0.000382"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.632989" elapsed="0.000439"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:22.532204" elapsed="0.101257"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.641341" elapsed="0.000024"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.641183" elapsed="0.000229"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.641155" elapsed="0.000294"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.643376" elapsed="0.000023"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.643214" elapsed="0.000228"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.643187" elapsed="0.000290"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:22.644293" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.643703" elapsed="0.000630"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.644936" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:22.644563" elapsed="0.000427"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.677056" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:22.645769" elapsed="0.031614"/>
</kw>
<msg time="2026-04-07T17:22:22.677712" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:22.677783" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.645212" elapsed="0.032625"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.736960" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:22.678923" elapsed="0.058346"/>
</kw>
<msg time="2026-04-07T17:22:22.737510" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:22.737556" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.678216" elapsed="0.059377"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.738134" elapsed="0.000029"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.737747" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.737699" elapsed="0.000555"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.738876" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.738401" elapsed="0.000582"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.739267" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.739053" elapsed="0.000291"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.739034" elapsed="0.000334"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:22.739407" elapsed="0.000045"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:22.742014" elapsed="0.000526"/>
</kw>
<kw name="Open 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-07T17:22:22.743513" elapsed="0.000523"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:22.744991" elapsed="0.000597"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:22.740437" elapsed="0.005228"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:22.739765" elapsed="0.006015"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:22.642742" elapsed="0.103168"/>
</kw>
<msg time="2026-04-07T17:22:22.746026" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.746072" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.641764" elapsed="0.104345"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:22.746296" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:22.746189" elapsed="0.000169"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.746170" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.746790" elapsed="0.000085"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.747219" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.747290" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:22.640635" elapsed="0.106761"/>
</kw>
<msg time="2026-04-07T17:22:22.747490" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.747532" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.633853" elapsed="0.113715"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.747886" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.747643" elapsed="0.000297"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.747626" elapsed="0.000338"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:22.633649" elapsed="0.114363"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.753440" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.753333" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.753314" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.754727" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.754620" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.754602" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:22.755317" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.754932" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.755759" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:22.755497" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.784816" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:22.756332" elapsed="0.028748"/>
</kw>
<msg time="2026-04-07T17:22:22.785263" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:22.785309" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.755937" elapsed="0.029409"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.842749" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:22.785942" elapsed="0.057001"/>
</kw>
<msg time="2026-04-07T17:22:22.843134" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:22.843180" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.785517" elapsed="0.057699"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.843516" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.843295" elapsed="0.000301"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.843273" elapsed="0.000358"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.844183" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "P "o "r "t "[C "I "n "[C "O "l "d "[C "[78CO "[A[78Cw
 "n "e "r "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.843779" elapsed="0.000489"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.844546" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.844334" elapsed="0.000328"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.844316" elapsed="0.000374"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:22.844723" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:22.847112" elapsed="0.000525"/>
</kw>
<kw name="Open 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-07T17:22:22.848571" elapsed="0.000503"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:22.850010" elapsed="0.000327"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:22.845597" elapsed="0.004814"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:22.845011" elapsed="0.005516"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:22.754323" elapsed="0.096303"/>
</kw>
<msg time="2026-04-07T17:22:22.850718" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.850762" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.753672" elapsed="0.097126"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:22.851000" elapsed="0.000028"/>
</return>
<status status="PASS" start="2026-04-07T17:22:22.850876" elapsed="0.000186"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.850857" elapsed="0.000230"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.851469" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.852009" elapsed="0.000028"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.852086" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:22.752884" elapsed="0.099312"/>
</kw>
<msg time="2026-04-07T17:22:22.852288" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.852331" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.748289" elapsed="0.104078"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.852687" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.852442" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.852425" elapsed="0.000343"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:22.748152" elapsed="0.104639"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:22.532038" elapsed="0.320783"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:22.529106" elapsed="0.323779"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:22.522492" elapsed="0.330457"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.522062" elapsed="0.330982"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:22.519347" elapsed="0.333763"/>
</kw>
<kw name="Delete Sample Port And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:22.864898" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Delete port vx2 from bridge br01 in controller ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.861072" elapsed="0.003865">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Delete port in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.518715" elapsed="0.346409">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t37" name="Delete Bridge In Old Owner And Verify After Recover" 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-07T17:22:22.868442" elapsed="0.000209"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:22.868183" elapsed="0.000523"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.869697" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.869572" elapsed="0.000227"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.869554" 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-07T17:22:22.874398" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.874291" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.874273" elapsed="0.000194"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.875470" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:22.875084" elapsed="0.000413"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.875961" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:22.875653" elapsed="0.000350"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:22.876048" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:22.876204" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:22.874688" elapsed="0.001541"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.881511" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.881403" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.881384" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.882815" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.882710" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.882691" elapsed="0.000192"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:22.883402" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.883045" elapsed="0.000383"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.883845" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:22.883583" elapsed="0.000288"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.914677" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:22.884426" elapsed="0.030436"/>
</kw>
<msg time="2026-04-07T17:22:22.915046" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:22.915092" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.884043" elapsed="0.031084"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:22.983171" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:22.915684" elapsed="0.067683"/>
</kw>
<msg time="2026-04-07T17:22:22.983537" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:22.983582" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.915294" elapsed="0.068325"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.983914" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.983696" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.983676" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:22.984555" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:22.984183" elapsed="0.000464"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.984929" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.984718" elapsed="0.000304"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.984697" elapsed="0.000351"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:22.985115" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:22.987440" elapsed="0.000508"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.988877" elapsed="0.000490"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:22.990287" elapsed="0.000320"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:22.985997" elapsed="0.004679"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:22.985371" elapsed="0.005417"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:22.882408" elapsed="0.108480"/>
</kw>
<msg time="2026-04-07T17:22:22.991002" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.991049" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.881740" elapsed="0.109346"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:22.991271" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:22.991164" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.991145" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.991737" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.992097" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.992170" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:22.881063" elapsed="0.111214"/>
</kw>
<msg time="2026-04-07T17:22:22.992369" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:22.992413" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.876605" elapsed="0.115844"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:22.992767" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:22.992523" elapsed="0.000298"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.992506" elapsed="0.000338"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:22.876468" elapsed="0.116399"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.998313" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.998205" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.998186" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:22.999623" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:22.999517" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:22.999499" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:23.000240" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:22.999865" elapsed="0.000401"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.000673" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:23.000418" elapsed="0.000281"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.031939" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:23.001252" elapsed="0.030866"/>
</kw>
<msg time="2026-04-07T17:22:23.032289" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:23.032335" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.000854" elapsed="0.031516"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.102676" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:23.032931" elapsed="0.070053"/>
</kw>
<msg time="2026-04-07T17:22:23.103160" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:23.103206" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.032538" elapsed="0.070705"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.103542" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.103323" elapsed="0.000295"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.103302" elapsed="0.000341"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.104168" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:23.103780" elapsed="0.000479"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.104535" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.104326" elapsed="0.000283"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.104308" elapsed="0.000326"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:23.104666" elapsed="0.000026"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.107061" elapsed="0.000544"/>
</kw>
<kw name="Open 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-07T17:22:23.108582" elapsed="0.000489"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:23.109998" elapsed="0.000322"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:23.105517" elapsed="0.004872"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:23.104932" elapsed="0.005570"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:22.999191" elapsed="0.111410"/>
</kw>
<msg time="2026-04-07T17:22:23.110690" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.110733" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.998525" elapsed="0.112246"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:23.110953" elapsed="0.000040"/>
</return>
<status status="PASS" start="2026-04-07T17:22:23.110847" elapsed="0.000181"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.110828" elapsed="0.000224"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.111430" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.111754" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.111825" elapsed="0.000015"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:22.997851" elapsed="0.114081"/>
</kw>
<msg time="2026-04-07T17:22:23.112055" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.112099" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.993143" elapsed="0.118993"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.112452" elapsed="0.000020"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.112210" elapsed="0.000294"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.112193" elapsed="0.000335"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:22.993005" elapsed="0.119546"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.117815" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.117705" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.117685" elapsed="0.000197"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.119265" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.119134" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.119116" elapsed="0.000217"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:23.119833" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:23.119469" elapsed="0.000390"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.120375" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:23.120117" elapsed="0.000284"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.160258" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:23.120930" elapsed="0.039515"/>
</kw>
<msg time="2026-04-07T17:22:23.160630" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:23.160675" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.120553" elapsed="0.040159"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.226227" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:23.161340" elapsed="0.065085"/>
</kw>
<msg time="2026-04-07T17:22:23.226594" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:23.226640" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.160901" elapsed="0.065774"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.227028" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.226766" elapsed="0.000339"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.226740" elapsed="0.000391"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.227649" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "D "e "l "e "t "e "[C "B "r "i "d "g "e "[C "I "n "[C "O "l "[78Cd "[A[78C
 "O "w "n "e "r "[C "A "n "d "[C "V "e "r "i "f "y "[C "A "f "t "e "r "[C "R "e "c "o "v "e "r "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:23.227276" elapsed="0.000463"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.228038" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.227809" elapsed="0.000305"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.227791" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:23.228175" elapsed="0.000035"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.230542" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:22:23.231964" elapsed="0.000494"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:23.233354" elapsed="0.000335"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:23.229075" elapsed="0.004687"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:23.228466" elapsed="0.005409"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:23.118807" elapsed="0.115182"/>
</kw>
<msg time="2026-04-07T17:22:23.234083" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.234127" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.118162" elapsed="0.116002"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:23.234401" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:23.234292" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.234272" elapsed="0.000212"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.234889" elapsed="0.000025"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.235239" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.235310" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:23.117339" elapsed="0.118080"/>
</kw>
<msg time="2026-04-07T17:22:23.235513" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.235556" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.112844" elapsed="0.122750"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.235913" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.235670" elapsed="0.000325"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.235653" elapsed="0.000368"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:23.112708" elapsed="0.123337"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:22.876289" elapsed="0.359790"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:22.873916" elapsed="0.362224"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:22.869285" elapsed="0.366913"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:22.868850" elapsed="0.367395"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:22.866174" elapsed="0.370126"/>
</kw>
<kw name="Delete Sample Bridge And Verify" owner="ClusterOvsdb">
<msg time="2026-04-07T17:22:23.250574" level="FAIL">Variable '${original_candidate}' not found.</msg>
<arg>${original_candidate}</arg>
<doc>Delete bridge br01 in ${controller_index} and verify it gets deleted in all instances in ${controller_index_list}.</doc>
<status status="FAIL" start="2026-04-07T17:22:23.246743" elapsed="0.003875">Variable '${original_candidate}' not found.</status>
</kw>
<doc>Delete bridge in Owner and verify it gets deleted from all instances.</doc>
<status status="FAIL" start="2026-04-07T17:22:22.865486" elapsed="0.385307">Variable '${original_candidate}' not found.</status>
</test>
<test id="s1-s2-s2-t38" name="Cleans Up Test Environment For Next Suite" 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-07T17:22:23.254114" elapsed="0.000252"/>
</kw>
<doc>This is just a more readable 'None' to override [Setup].</doc>
<status status="PASS" start="2026-04-07T17:22:23.253830" elapsed="0.000594"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Log_Testcase_Start_To_Controller_Karaf" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.255461" elapsed="0.000015"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.255337" elapsed="0.000173"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.255313" 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-07T17:22:23.260106" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.259997" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.259964" elapsed="0.000209"/>
</if>
<kw name="List_Indices_Or_All" owner="ClusterManagement">
<kw name="Set Variable If" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.261175" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:23.260770" elapsed="0.000432"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.261695" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:23.261357" elapsed="0.000364"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:23.261765" elapsed="0.000031"/>
</return>
<msg time="2026-04-07T17:22:23.261922" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:23.260396" elapsed="0.001550"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.267214" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.267105" elapsed="0.000154"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.267086" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.268484" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.268378" elapsed="0.000151"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.268361" elapsed="0.000189"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:23.269077" level="INFO">${karaf_connection_index} = 602</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:23.268691" elapsed="0.000413"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.269522" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:23.269257" elapsed="0.000291"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.301697" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:23.270115" elapsed="0.032033"/>
</kw>
<msg time="2026-04-07T17:22:23.302540" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:23.302645" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.269720" elapsed="0.033011"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.363818" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:23.304088" elapsed="0.060101"/>
</kw>
<msg time="2026-04-07T17:22:23.364442" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:23.364491" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.303175" elapsed="0.061354"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.365023" elapsed="0.000028"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.364654" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.364616" elapsed="0.000520"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.365779" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:23.365283" elapsed="0.000588"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.366170" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.365938" elapsed="0.000309"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.365920" elapsed="0.000352"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:23.366311" elapsed="0.000040"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.368833" elapsed="0.000548"/>
</kw>
<kw name="Open 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-07T17:22:23.370363" elapsed="0.000507"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:23.371806" elapsed="0.000353"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:23.367291" elapsed="0.004940"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:23.366640" elapsed="0.005707"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:23.268080" elapsed="0.104371"/>
</kw>
<msg time="2026-04-07T17:22:23.372548" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.372594" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.267428" elapsed="0.105204"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:23.372899" elapsed="0.000025"/>
</return>
<status status="PASS" start="2026-04-07T17:22:23.372787" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.372765" elapsed="0.000249"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 1,
close the previous connection. In any case create a new connection
to karaf console for 1, set correct prompt set and login to karaf console.
Store connection index for 1 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.373426" elapsed="0.000024"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.373801" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.373872" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:23.266701" elapsed="0.107299"/>
</kw>
<msg time="2026-04-07T17:22:23.374100" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.374144" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.262347" elapsed="0.111834"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.374525" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.374259" elapsed="0.000320"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.374242" elapsed="0.000361"/>
</if>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:23.262207" elapsed="0.112420"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.380199" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.380090" elapsed="0.000155"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.380072" elapsed="0.000195"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.381551" elapsed="0.000016"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.381428" elapsed="0.000171"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.381411" elapsed="0.000211"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:23.382146" level="INFO">${karaf_connection_index} = 604</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:23.381762" elapsed="0.000411"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.382592" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:23.382329" elapsed="0.000289"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.413385" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:23.383167" elapsed="0.030608"/>
</kw>
<msg time="2026-04-07T17:22:23.414365" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:23.414468" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.382773" elapsed="0.031774"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.473086" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:23.415852" elapsed="0.057433"/>
</kw>
<msg time="2026-04-07T17:22:23.473468" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:23.473540" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.414938" elapsed="0.058640"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.473881" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.473658" elapsed="0.000300"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.473636" elapsed="0.000375"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.474535" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:23.474156" elapsed="0.000509"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.474955" elapsed="0.000040"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.474737" elapsed="0.000315"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.474716" elapsed="0.000361"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:23.475135" elapsed="0.000032"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.477504" elapsed="0.000555"/>
</kw>
<kw name="Open 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-07T17:22:23.479013" elapsed="0.000481"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:23.480430" elapsed="0.000329"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:23.476013" elapsed="0.004816"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:23.475407" elapsed="0.005539"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:23.381128" elapsed="0.099948"/>
</kw>
<msg time="2026-04-07T17:22:23.481170" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.481215" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.380414" elapsed="0.100839"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:23.481439" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:23.481330" elapsed="0.000206"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.481311" elapsed="0.000251"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 2,
close the previous connection. In any case create a new connection
to karaf console for 2, set correct prompt set and login to karaf console.
Store connection index for 2 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.481950" elapsed="0.000044"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.482311" elapsed="0.000024"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.482382" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:23.379725" elapsed="0.102763"/>
</kw>
<msg time="2026-04-07T17:22:23.482579" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.482622" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.374909" elapsed="0.107750"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.482992" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.482732" elapsed="0.000316"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.482715" elapsed="0.000356"/>
</if>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:23.374768" elapsed="0.108326"/>
</iter>
<iter>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_With_Retry_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.488348" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.488241" elapsed="0.000153"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.488222" elapsed="0.000194"/>
</if>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<if>
<branch type="IF" condition="'${IS_KARAF_APPL}' == 'False'">
<return>
<value>Not A Karaf App</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.489619" elapsed="0.000014"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:23.489512" elapsed="0.000152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.489493" elapsed="0.000195"/>
</if>
<kw name="Get From Dictionary" owner="Collections">
<msg time="2026-04-07T17:22:23.490215" level="INFO">${karaf_connection_index} = 606</msg>
<var>${karaf_connection_index}</var>
<arg>${connection_index_dict}</arg>
<arg>${member_index}</arg>
<doc>Returns a value from the given ``dictionary`` based on the given ``key``.</doc>
<status status="PASS" start="2026-04-07T17:22:23.489840" elapsed="0.000402"/>
</kw>
<kw name="Switch Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.490655" level="INFO">${current_connection_index} = None</msg>
<var>${current_connection_index}</var>
<arg>${karaf_connection_index}</arg>
<doc>Switches the active connection by index or alias.</doc>
<status status="PASS" start="2026-04-07T17:22:23.490394" elapsed="0.000287"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Write" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.521303" level="INFO">log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "p "s "t "r "e "a "m "- "c "l "[78Cu "[A[78Cs</msg>
<arg>${command}</arg>
<doc>Writes the given ``text`` on the remote machine and appends a newline.</doc>
<status status="PASS" start="2026-04-07T17:22:23.491282" elapsed="0.030204"/>
</kw>
<msg time="2026-04-07T17:22:23.521730" level="INFO">${status_write} = PASS</msg>
<msg time="2026-04-07T17:22:23.521781" level="INFO">${message_write} = log:log " "R "O "B "O "T "[C "M "E "S "S "A "G "E ": "[C "S "t "a "r "t "i "n "g "[C "t "e "s "t "[C "o "v "s "d "b "- "u "...</msg>
<var>${status_write}</var>
<var>${message_write}</var>
<arg>SSHLibrary.Write</arg>
<arg>${command}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.490867" elapsed="0.030951"/>
</kw>
<kw name="Run Keyword And Ignore Error" owner="BuiltIn">
<kw name="Read Until Regexp" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.583252" level="INFO">"t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${KARAF_PROMPT}</arg>
<doc>Consumes and returns the server output until a match to ``regexp`` is found.</doc>
<status status="PASS" start="2026-04-07T17:22:23.522487" elapsed="0.060961"/>
</kw>
<msg time="2026-04-07T17:22:23.583618" level="INFO">${status_wait} = PASS</msg>
<msg time="2026-04-07T17:22:23.583663" level="INFO">${message_wait} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status_wait}</var>
<var>${message_wait}</var>
<arg>SSHLibrary.Read_Until_Regexp</arg>
<arg>${KARAF_PROMPT}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.522046" elapsed="0.061653"/>
</kw>
<if>
<branch type="IF" condition="'${status_write}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to send the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.584019" elapsed="0.000024"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.583778" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.583758" elapsed="0.000364"/>
</if>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.584636" level="INFO"> "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r "[C "E "x "t "e "n "s "i "o "n ". "C "l "e "a "n "s "[C "U "p "[C "T "e "s "t "[C "E "n "v "i "[78Cr "[A[78Co
 "n "m "e "n "t "[C "F "o "r "[C "N "e "x "t "[C "S "u "i "t "e "[K"
[?1l&gt;[?2004l[?1h=[90m~[0m                                                                                [?2004hopendaylight-user@root&gt;</msg>
<arg>${message_wait}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:23.584264" elapsed="0.000456"/>
</kw>
<if>
<branch type="IF" condition="'${status_wait}' != 'PASS'">
<kw name="Fail" owner="BuiltIn">
<arg>Failed to see prompt after sending the command: ${command}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.585017" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.584787" elapsed="0.000306"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.584769" elapsed="0.000348"/>
</if>
<return>
<value>${message_wait}</value>
<status status="PASS" start="2026-04-07T17:22:23.585150" elapsed="0.000028"/>
</return>
<kw name="Run Keyword If" owner="BuiltIn" type="TEARDOWN">
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.587464" elapsed="0.000529"/>
</kw>
<kw name="Open 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-07T17:22:23.588903" elapsed="0.000485"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:23.590306" elapsed="0.000316"/>
</kw>
<arg>${current_connection_index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:23.586016" elapsed="0.004676"/>
</kw>
<arg>'${IS_KARAF_APPL}' == 'True'</arg>
<arg>SSHKeywords.Restore_Current_Ssh_Connection_From_Index</arg>
<arg>${current_connection_index}</arg>
<doc>Runs the given keyword with the given arguments, if ``condition`` is true.</doc>
<status status="PASS" start="2026-04-07T17:22:23.585405" elapsed="0.005399"/>
</kw>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="PASS" start="2026-04-07T17:22:23.489196" elapsed="0.101707"/>
</kw>
<msg time="2026-04-07T17:22:23.591029" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.591074" level="INFO">${message} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${message}</var>
<arg>Execute_Controller_Karaf_Command_On_Background</arg>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.488562" elapsed="0.102548"/>
</kw>
<if>
<branch type="IF" condition="'${status}' == 'PASS'">
<return>
<value>${message}</value>
<status status="PASS" start="2026-04-07T17:22:23.591293" elapsed="0.000026"/>
</return>
<status status="PASS" start="2026-04-07T17:22:23.591187" elapsed="0.000165"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.591168" elapsed="0.000208"/>
</if>
<kw name="Open_Controller_Karaf_Console_On_Background" owner="KarafKeywords">
<arg>${member_index}</arg>
<doc>If there is a stored ssh connection index of connection to the controller's karaf console for 3,
close the previous connection. In any case create a new connection
to karaf console for 3, set correct prompt set and login to karaf console.
Store connection index for 3 and restore the previous active connection.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.591761" elapsed="0.000026"/>
</kw>
<kw name="Execute_Controller_Karaf_Command_On_Background" owner="KarafKeywords">
<var>${message}</var>
<arg>${command}</arg>
<arg>${member_index}</arg>
<doc>Send command to karaf without affecting current SSH connection. Read, log and return response.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.592108" elapsed="0.000025"/>
</kw>
<return>
<value>${message}</value>
<status status="NOT RUN" start="2026-04-07T17:22:23.592179" elapsed="0.000016"/>
</return>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Attemp to send command to karaf for ${member_index}, if fail then open connection and try again.</doc>
<status status="PASS" start="2026-04-07T17:22:23.487875" elapsed="0.104410"/>
</kw>
<msg time="2026-04-07T17:22:23.592375" level="INFO">${status} = PASS</msg>
<msg time="2026-04-07T17:22:23.592418" level="INFO">${output} =  "t "e "r "i "n "g ". "t "x "t ". "S "o "u "t "h "b "o "u "n "d "[C "C "l "u "s "t "e "r ". "S "o "u "t "h "b "o "u "n "...</msg>
<var>${status}</var>
<var>${output}</var>
<arg>Execute_Controller_Karaf_Command_With_Retry_On_Background</arg>
<arg>log:log "ROBOT MESSAGE: ${message}"</arg>
<arg>member_index=${index}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.483363" elapsed="0.109091"/>
</kw>
<if>
<branch type="IF" condition="not ${tolerate_failure} and &quot;${status}&quot; != &quot;PASS&quot;">
<kw name="Fail" owner="BuiltIn">
<arg>${output}</arg>
<doc>Fails the test with the given message and optionally alters its tags.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:23.592824" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.592575" elapsed="0.000303"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.592557" elapsed="0.000344"/>
</if>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:23.483225" elapsed="0.109700"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:23.262023" elapsed="0.330931"/>
</for>
<arg>Starting test ${SUITE_NAME}.${TEST_NAME}</arg>
<arg>${member_index_list}</arg>
<doc>Make sure this resource is initialized. Send a message into the controller's karaf log file on every node listed (or all).
By default, failure while processing a node is silently ignored, unless ${tolerate_failure} is False.</doc>
<status status="PASS" start="2026-04-07T17:22:23.259618" elapsed="0.333419"/>
</kw>
<arg>member_index_list=${member_index_list}</arg>
<doc>Log test case name to karaf log, useful in test case setup.</doc>
<status status="PASS" start="2026-04-07T17:22:23.255035" elapsed="0.338065"/>
</kw>
<arg>KarafKeywords.Log_Testcase_Start_To_Controller_Karaf</arg>
<arg>member_index_list=${member_index_list}</arg>
<doc>Runs the given keyword with the given arguments and ignores possible error.</doc>
<status status="PASS" start="2026-04-07T17:22:23.254573" elapsed="0.338575"/>
</kw>
<doc>Test case setup which explicitly ignores previous failure and logs test case name to Karaf log.
Needed if the recommended default is to be overriden.</doc>
<status status="PASS" start="2026-04-07T17:22:23.251803" elapsed="0.341402"/>
</kw>
<kw name="Configure Exit OVSDB Connection" owner="ClusterOvsdb">
<kw name="Clean OVSDB Test Environment" owner="OVSDB">
<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-07T17:22:23.598502" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:23.598238" elapsed="0.000321"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:23.598220" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.598873" 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-07T17:22:23.599040" 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-07T17:22:23.598728" elapsed="0.000342"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.599605" level="INFO">Attempting to execute command "sudo mn -c" on remote system "10.30.171.56" 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-07T17:22:23.599221" elapsed="0.000429"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.600194" level="INFO">${conn_id} = 747</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-07T17:22:23.599801" elapsed="0.000418"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:23.601146" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:23.601222" 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-07T17:22:23.600832" elapsed="0.000414"/>
</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-07T17:22:23.601402" elapsed="0.000333"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.602589" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:23.962441" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:09 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:23.602273" elapsed="0.360296"/>
</kw>
<msg time="2026-04-07T17:22:23.962643" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.601900" elapsed="0.360812"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:23.600435" elapsed="0.362372"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:23.963261" level="INFO">Executing command 'sudo mn -c'.</msg>
<msg time="2026-04-07T17:22:25.122089" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:25.122479" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:25.122578" level="INFO">${stderr} = *** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec iv...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:23.963030" elapsed="1.159605"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.123298" elapsed="0.000572"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.125002" level="INFO">*** Removing excess controllers/ofprotocols/ofdatapaths/pings/noxes
killall controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
killall -9 controller ofprotocol ofdatapath ping nox_corelt-nox_core ovs-openflowd ovs-controllerovs-testcontroller udpbwtest mnexec ivs ryu-manager 2&gt; /dev/null
pkill -9 -f "sudo mnexec"
*** Removing junk from /tmp
rm -f /tmp/vconn* /tmp/vlogs* /tmp/*.out /tmp/*.log
*** Removing old X11 tunnels
*** Removing excess kernel datapaths
ps ax | egrep -o 'dp[0-9]+' | sed 's/dp/nl:/'
***  Removing OVS datapaths
ovs-vsctl --timeout=1 list-br
ovs-vsctl --timeout=1 list-br
*** Removing all links of the pattern foo-ethX
ip link show | egrep -o '([-_.[:alnum:]]+-eth[[:digit:]]+)'
ip link show
*** Killing stale mininet node processes
pkill -9 -f mininet:
*** Shutting down stale tunnels
pkill -9 -f Tunnel=Ethernet
pkill -9 -f .ssh/mn
rm -f ~/.ssh/mn/*
*** Cleanup complete.</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:25.124311" elapsed="0.000815"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.125599" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:25.125304" elapsed="0.000402"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.125253" elapsed="0.000510"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:25.126168" elapsed="0.000068"/>
</return>
<status status="PASS" start="2026-04-07T17:22:25.125899" elapsed="0.000411"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.125860" elapsed="0.000503"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.126439" elapsed="0.000030"/>
</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-07T17:22:25.132723" elapsed="0.000747"/>
</kw>
<kw name="Open 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-07T17:22:25.133846" elapsed="0.000247"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.134240" elapsed="0.000097"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:25.127172" elapsed="0.007218"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:23.597698" elapsed="1.536785"/>
</kw>
<msg time="2026-04-07T17:22:25.134540" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:23.597134" elapsed="1.537460"/>
</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="PASS" start="2026-04-07T17:22:23.596636" elapsed="1.538040"/>
</kw>
<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-07T17:22:25.136741" elapsed="0.000023"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:25.136462" elapsed="0.000336"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.136443" elapsed="0.000379"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.137126" 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-07T17:22:25.137229" 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-07T17:22:25.136984" elapsed="0.000271"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.137780" level="INFO">Attempting to execute command "sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh" on remote system "10.30.171.56" 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-07T17:22:25.137401" elapsed="0.000424"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.138360" level="INFO">${conn_id} = 749</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-07T17:22:25.137991" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.139282" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:25.139358" 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-07T17:22:25.139002" elapsed="0.000379"/>
</kw>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${pwd_length} &gt; 0</arg>
<arg>SSHLibrary.Login</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.139533" elapsed="0.000315"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.140913" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:25.478073" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:23 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:25.140540" elapsed="0.337693"/>
</kw>
<msg time="2026-04-07T17:22:25.478321" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.140119" elapsed="0.338287"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:25.138594" elapsed="0.339928"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.479069" level="INFO">Executing command 'sudo ps -elf | egrep 'usr/local/bin/mn' | egrep python | awk '{print "sudo kill -9",$4}' | sh'.</msg>
<msg time="2026-04-07T17:22:25.511748" level="INFO">Command exited with return code -1.</msg>
<msg time="2026-04-07T17:22:25.511867" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:25.511911" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:25.478777" elapsed="0.033157"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.512122" elapsed="0.000240"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.512902" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:25.512595" elapsed="0.000349"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.513209" elapsed="0.000018"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:25.513053" elapsed="0.000208"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.513024" elapsed="0.000261"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:25.513445" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:25.513339" elapsed="0.000166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.513323" elapsed="0.000207"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.513564" elapsed="0.000015"/>
</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-07T17:22:25.516317" elapsed="0.000336"/>
</kw>
<kw name="Open 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-07T17:22:25.516820" elapsed="0.000181"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.517146" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:25.513890" elapsed="0.003405"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:25.135921" elapsed="0.381465"/>
</kw>
<msg time="2026-04-07T17:22:25.517440" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.135360" elapsed="0.382130"/>
</kw>
<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="PASS" start="2026-04-07T17:22:25.134848" elapsed="0.382724"/>
</kw>
<arg>${tools_system}</arg>
<status status="PASS" start="2026-04-07T17:22:23.596291" elapsed="1.921341"/>
</kw>
<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-07T17:22:25.519697" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:25.519434" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.519415" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.520084" 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-07T17:22:25.520186" 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-07T17:22:25.519929" elapsed="0.000346"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.520834" level="INFO">Attempting to execute command "sudo ovs-vsctl del-manager" on remote system "10.30.171.56" 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-07T17:22:25.520426" elapsed="0.000454"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.521417" level="INFO">${conn_id} = 751</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-07T17:22:25.521049" elapsed="0.000394"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.522344" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:25.522419" 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-07T17:22:25.522065" elapsed="0.000378"/>
</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-07T17:22:25.522595" elapsed="0.000313"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.523749" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:25.867488" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:25 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:25.523439" elapsed="0.344215"/>
</kw>
<msg time="2026-04-07T17:22:25.867742" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.523093" elapsed="0.344739"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:25.521653" elapsed="0.346298"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.868561" level="INFO">Executing command 'sudo ovs-vsctl del-manager'.</msg>
<msg time="2026-04-07T17:22:25.891363" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:25.891613" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:25.891710" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:25.868249" elapsed="0.023512"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.892164" elapsed="0.000509"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.893757" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:25.893128" elapsed="0.000721"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.894364" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:25.894062" elapsed="0.000412"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.894005" elapsed="0.000521"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:25.894877" elapsed="0.000057"/>
</return>
<status status="PASS" start="2026-04-07T17:22:25.894646" elapsed="0.000396"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.894612" elapsed="0.000488"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:25.895176" elapsed="0.000032"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.901039" elapsed="0.000444"/>
</kw>
<kw name="Open 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-07T17:22:25.901706" elapsed="0.000219"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:25.902145" elapsed="0.000135"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:25.895863" elapsed="0.006488"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:25.518887" elapsed="0.383591"/>
</kw>
<msg time="2026-04-07T17:22:25.902551" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.518329" elapsed="0.384291"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo ovs-vsctl del-manager</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:25.517820" elapsed="0.385000"/>
</kw>
<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-07T17:22:25.905736" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:25.905371" elapsed="0.000443"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:25.905346" elapsed="0.000501"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.906255" 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-07T17:22:25.906396" 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-07T17:22:25.906067" elapsed="0.000365"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.907184" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl stop" on remote system "10.30.171.56" 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-07T17:22:25.906633" elapsed="0.000615"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.907960" level="INFO">${conn_id} = 753</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-07T17:22:25.907457" elapsed="0.000559"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:25.909264" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:25.909370" 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-07T17:22:25.908861" elapsed="0.000542"/>
</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-07T17:22:25.909613" elapsed="0.000460"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:25.911245" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:26.224834" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:25 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:25.910785" elapsed="0.314336"/>
</kw>
<msg time="2026-04-07T17:22:26.225280" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.910299" elapsed="0.315132"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:25.908323" elapsed="0.317327"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.226638" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl stop'.</msg>
<msg time="2026-04-07T17:22:26.512729" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:26.513213" level="INFO">${stdout} =  * Exiting ovs-vswitchd (8410)
 * Exiting ovsdb-server (8393)</msg>
<msg time="2026-04-07T17:22:26.513317" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:26.226149" elapsed="0.287230"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:26.513878" elapsed="0.000574"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.515595" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:26.514882" elapsed="0.000807"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:26.516236" elapsed="0.000037"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:26.515869" elapsed="0.000474"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.515816" elapsed="0.000578"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:26.516747" elapsed="0.000084"/>
</return>
<status status="PASS" start="2026-04-07T17:22:26.516515" elapsed="0.000392"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.516479" elapsed="0.000481"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:26.517098" elapsed="0.000033"/>
</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-07T17:22:26.522000" elapsed="0.000345"/>
</kw>
<kw name="Open 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-07T17:22:26.522601" elapsed="0.000168"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:26.522913" elapsed="0.000114"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:26.517823" elapsed="0.005259"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:25.904616" elapsed="0.618561"/>
</kw>
<msg time="2026-04-07T17:22:26.523237" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:25.903806" elapsed="0.619485"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl stop</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:25.903115" elapsed="0.620260"/>
</kw>
<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-07T17:22:26.525485" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:26.525222" elapsed="0.000319"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.525203" elapsed="0.000362"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.525887" 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-07T17:22:26.526008" 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-07T17:22:26.525729" elapsed="0.000306"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.526560" level="INFO">Attempting to execute command "sudo rm -rf /etc/openvswitch/conf.db" on remote system "10.30.171.56" 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-07T17:22:26.526184" elapsed="0.000422"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.527134" level="INFO">${conn_id} = 755</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-07T17:22:26.526755" elapsed="0.000404"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.528079" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:26.528162" 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-07T17:22:26.527774" elapsed="0.000412"/>
</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-07T17:22:26.528338" elapsed="0.000316"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.529495" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:26.858382" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:26 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:26.529183" elapsed="0.329358"/>
</kw>
<msg time="2026-04-07T17:22:26.858628" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:26.528814" elapsed="0.329905"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:26.527378" elapsed="0.331457"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.859367" level="INFO">Executing command 'sudo rm -rf /etc/openvswitch/conf.db'.</msg>
<msg time="2026-04-07T17:22:26.882794" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:26.883188" level="INFO">${stdout} = </msg>
<msg time="2026-04-07T17:22:26.883299" level="INFO">${stderr} = </msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:26.859106" elapsed="0.024244"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:26.883898" elapsed="0.000525"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.885555" level="INFO"/>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:26.884835" elapsed="0.000816"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:26.886173" elapsed="0.000049"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:26.885831" elapsed="0.000467"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.885778" elapsed="0.000574"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:26.886716" elapsed="0.000058"/>
</return>
<status status="PASS" start="2026-04-07T17:22:26.886476" elapsed="0.000372"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.886440" elapsed="0.000461"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:26.887008" elapsed="0.000036"/>
</return>
<kw name="Restore_Current_Ssh_Connection_From_Index" owner="SSHKeywords" type="TEARDOWN">
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>${connection_index} is not None</arg>
<arg>SSHLibrary.Switch Connection</arg>
<arg>${connection_index}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:26.893106" elapsed="0.000472"/>
</kw>
<kw name="Open 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-07T17:22:26.893810" elapsed="0.000245"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:26.894261" elapsed="0.000150"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:26.887719" elapsed="0.006773"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:26.524678" elapsed="0.369942"/>
</kw>
<msg time="2026-04-07T17:22:26.894694" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:26.524096" elapsed="0.370668"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo rm -rf /etc/openvswitch/conf.db</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:26.523571" elapsed="0.371305"/>
</kw>
<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-07T17:22:26.897901" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:26.897522" elapsed="0.000480"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:26.897488" elapsed="0.000577"/>
</if>
<kw name="Get Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.898493" 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-07T17:22:26.898653" 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-07T17:22:26.898282" elapsed="0.000408"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.899451" level="INFO">Attempting to execute command "sudo /usr/share/openvswitch/scripts/ovs-ctl start" on remote system "10.30.171.56" 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-07T17:22:26.898898" elapsed="0.000628"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.900288" level="INFO">${conn_id} = 757</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-07T17:22:26.899738" elapsed="0.000585"/>
</kw>
<kw name="Flexible_SSH_Login" owner="SSHKeywords">
<kw name="Get Length" owner="BuiltIn">
<msg time="2026-04-07T17:22:26.901590" level="INFO">Length is 0.</msg>
<msg time="2026-04-07T17:22:26.901703" 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-07T17:22:26.901196" elapsed="0.000541"/>
</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-07T17:22:26.901951" elapsed="0.000467"/>
</kw>
<kw name="Run Keyword And Return" owner="BuiltIn">
<kw name="Login With Public Key" owner="SSHLibrary">
<msg time="2026-04-07T17:22:26.903919" level="INFO">Logging into '10.30.171.56:22' as 'jenkins'.</msg>
<msg time="2026-04-07T17:22:27.218979" level="INFO">Read output: Welcome to Ubuntu 22.04.5 LTS (GNU/Linux 5.15.0-153-generic x86_64)

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

 System information as of Tue Apr  7 17:22:06 UTC 2026

  System load:  0.03               Processes:             106
  Usage of /:   19.3% of 38.58GB   Users logged in:       0
  Memory usage: 4%                 IPv4 address for ens3: 10.30.171.56
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

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


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


Last login: Tue Apr  7 17:22:26 2026 from 10.30.171.89
[?2004h[jenkins@releng-51713-168-1-mininet-ovs-217-0 ~]&gt;</msg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Logs into the SSH server using key-based authentication.</doc>
<status status="PASS" start="2026-04-07T17:22:26.903179" elapsed="0.316057"/>
</kw>
<msg time="2026-04-07T17:22:27.219319" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>SSHLibrary.Login With Public Key</arg>
<arg>${user}</arg>
<arg>${USER_HOME}/.ssh/${SSH_KEY}</arg>
<arg>${KEYFILE_PASS}</arg>
<arg>delay=${delay}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:26.902659" elapsed="0.316741"/>
</kw>
<arg>${user}</arg>
<arg>${password}</arg>
<doc>On active SSH session: if given non-empty password, do Login, else do Login With Public Key.</doc>
<status status="PASS" start="2026-04-07T17:22:26.900627" elapsed="0.318884"/>
</kw>
<kw name="Execute Command" owner="SSHLibrary">
<msg time="2026-04-07T17:22:27.220036" level="INFO">Executing command 'sudo /usr/share/openvswitch/scripts/ovs-ctl start'.</msg>
<msg time="2026-04-07T17:22:27.323529" level="INFO">Command exited with return code 0.</msg>
<msg time="2026-04-07T17:22:27.323907" level="INFO">${stdout} =  * /etc/openvswitch/conf.db does not exist
 * Creating empty database /etc/openvswitch/conf.db
 * Starting ovsdb-server
 * system ID not configured, please use --system-id
 * Configuring Open vSwitch ...</msg>
<msg time="2026-04-07T17:22:27.324070" level="INFO">${stderr} = 2026-04-07T17:22:27Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:22:27Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:22:27Z|00001|dns_res...</msg>
<var>${stdout}</var>
<var>${stderr}</var>
<arg>${cmd}</arg>
<arg>return_stderr=True</arg>
<doc>Executes ``command`` on the remote machine and returns its outputs.</doc>
<status status="PASS" start="2026-04-07T17:22:27.219774" elapsed="0.104358"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:27.324597" elapsed="0.000552"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.326317" level="INFO">2026-04-07T17:22:27Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:22:27Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error
2026-04-07T17:22:27Z|00001|dns_resolve|WARN|Failed to read etc/hosts: syntax error</msg>
<arg>${stderr}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.325559" elapsed="0.000876"/>
</kw>
<if>
<branch type="IF" condition="&quot;${return_stdout}&quot;!=&quot;True&quot;">
<return>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:27.326909" elapsed="0.000045"/>
</return>
<status status="NOT RUN" start="2026-04-07T17:22:27.326612" elapsed="0.000453"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.326560" elapsed="0.000558"/>
</if>
<if>
<branch type="IF" condition="&quot;${return_stderr}&quot;!=&quot;True&quot;">
<return>
<value>${stdout}</value>
<status status="PASS" start="2026-04-07T17:22:27.327478" elapsed="0.000065"/>
</return>
<status status="PASS" start="2026-04-07T17:22:27.327240" elapsed="0.000401"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.327206" elapsed="0.000491"/>
</if>
<return>
<value>${stdout}</value>
<value>${stderr}</value>
<status status="NOT RUN" start="2026-04-07T17:22:27.327773" elapsed="0.000033"/>
</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-07T17:22:27.332681" elapsed="0.000414"/>
</kw>
<kw name="Open Connection" owner="SSHLibrary">
<arg>127.0.0.1</arg>
<doc>Opens a new SSH connection to the given ``host`` and ``port``.</doc>
<status status="PASS" start="2026-04-07T17:22:27.333260" elapsed="0.000161"/>
</kw>
<kw name="Close Connection" owner="SSHLibrary">
<doc>Closes the current connection.</doc>
<status status="PASS" start="2026-04-07T17:22:27.333565" elapsed="0.000098"/>
</kw>
<arg>${current_ssh_connection.index}</arg>
<doc>Restore active SSH connection in SSHLibrary to given index.</doc>
<status status="PASS" start="2026-04-07T17:22:27.328511" elapsed="0.005205"/>
</kw>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Reduces the common work of running a command on a remote system to a single higher level
robot keyword, taking care to log in with a public key and. The command given is written and the return value
depends on the passed argument values of return_stdout (default: True) and return_stderr (default: False).
At least one should be True, or the keyword will exit and FAIL. If both are True, the resulting return value
will be a two element list containing both. Otherwise the resulting return value is a string.
No test conditions are checked.</doc>
<status status="PASS" start="2026-04-07T17:22:26.896703" elapsed="0.437106"/>
</kw>
<msg time="2026-04-07T17:22:27.333870" level="INFO">Returning from the enclosing user keyword.</msg>
<arg>Run Command On Remote System</arg>
<arg>${system}</arg>
<arg>${cmd}</arg>
<arg>${user}</arg>
<arg>${password}</arg>
<arg>prompt=${prompt}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:26.895887" elapsed="0.438036"/>
</kw>
<arg>${tools_system}</arg>
<arg>sudo /usr/share/openvswitch/scripts/ovs-ctl start</arg>
<doc>Call Run Comand On Remote System, but with default values suitable for Mininet machine.</doc>
<status status="PASS" start="2026-04-07T17:22:26.895170" elapsed="0.438861"/>
</kw>
<arg>${TOOLS_SYSTEM_IP}</arg>
<doc>General Use Keyword attempting to sanitize test environment for OVSDB related
tests. Not every step will always be neccessary, but should not cause any problems for
any new ovsdb test suites.</doc>
<status status="PASS" start="2026-04-07T17:22:23.595894" elapsed="3.738206"/>
</kw>
<kw name="Create Dictionary" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.334606" level="INFO">${dictionary} = {'ovsdb://uuid': '0'}</msg>
<var>${dictionary}</var>
<arg>ovsdb://uuid=0</arg>
<doc>Creates and returns a dictionary based on the given ``items``.</doc>
<status status="PASS" start="2026-04-07T17:22:27.334282" elapsed="0.000350"/>
</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-07T17:22:27.340601" level="INFO">${return_list_reference} = [1, 2, 3]</msg>
<var>${return_list_reference}</var>
<arg>"""${given_list}""" != ""</arg>
<arg>${given_list}</arg>
<arg>${ClusterManagement__member_index_list}</arg>
<doc>Sets variable based on the given condition.</doc>
<status status="PASS" start="2026-04-07T17:22:27.340220" elapsed="0.000407"/>
</kw>
<kw name="Create List" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.341215" level="INFO">${return_list_copy} = [1, 2, 3]</msg>
<var>${return_list_copy}</var>
<arg>@{return_list_reference}</arg>
<doc>Returns a list containing given items.</doc>
<status status="PASS" start="2026-04-07T17:22:27.340780" elapsed="0.000461"/>
</kw>
<return>
<value>${return_list_copy}</value>
<status status="PASS" start="2026-04-07T17:22:27.341284" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:27.341436" level="INFO">${index_list} = [1, 2, 3]</msg>
<var>${index_list}</var>
<arg>given_list=${member_index_list}</arg>
<doc>Utility to allow ${EMPTY} as default argument value, as the internal list is computed at runtime.
This keyword always returns a (shallow) copy of given or default list,
so operations with the returned list should not affect other lists.
Also note that this keyword does not consider empty list to be ${EMPTY}.</doc>
<status status="PASS" start="2026-04-07T17:22:27.339831" elapsed="0.001629"/>
</kw>
<for flavor="IN">
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.347139" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.346807" elapsed="0.000358"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:27.347316" elapsed="0.000028"/>
</return>
<msg time="2026-04-07T17:22:27.347463" level="INFO">${session} = ClusterManagement__session_1</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:27.346460" elapsed="0.001027"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.353718" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.353468" elapsed="0.000295"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.354184" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.353912" elapsed="0.000315"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:27.365235" level="INFO">GET Request : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01np3zsdrvjppfcznbxc24fjai123.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:27.365380" level="INFO">GET Response : url=http://10.30.170.175:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:27.365480" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:27.356266" elapsed="0.009240"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.354295" elapsed="0.011253"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.365753" elapsed="0.000031"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.365575" elapsed="0.000257"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.354276" elapsed="0.011587"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.370494" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.367345" elapsed="0.003215"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.367034" elapsed="0.003575"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.367006" elapsed="0.003639"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.375752" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.371123" elapsed="0.004733"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.370743" elapsed="0.005166"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.370716" elapsed="0.005225"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.376523" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.376127" elapsed="0.000422"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.376854" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.376621" elapsed="0.000291"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.377421" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.377120" elapsed="0.000327"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.376944" elapsed="0.000539"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.376602" elapsed="0.000902"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.378044" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.377654" elapsed="0.000417"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.378371" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.378142" elapsed="0.000285"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.378912" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.378603" elapsed="0.000342"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.378450" elapsed="0.000550"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.378124" elapsed="0.000899"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:27.379169" elapsed="0.000346"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:27.380056" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.379693" elapsed="0.000442"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:27.380290" elapsed="0.004098"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:27.366404" elapsed="0.018049"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:27.384631" elapsed="0.000034"/>
</return>
<status status="PASS" start="2026-04-07T17:22:27.384523" elapsed="0.000176"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.384505" elapsed="0.000218"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.384867" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:27.384944" elapsed="0.000017"/>
</return>
<msg time="2026-04-07T17:22:27.387110" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:27.347841" elapsed="0.039296"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:27.387189" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:27.387336" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:27.345913" elapsed="0.041448"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.388617" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:27.388230" elapsed="0.000453"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:22:27.388073" elapsed="0.000651"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:27.387903" elapsed="0.000851"/>
</for>
<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="PASS" start="2026-04-07T17:22:27.387626" elapsed="0.001181"/>
</kw>
<var name="${index}">1</var>
<status status="PASS" start="2026-04-07T17:22:27.341733" elapsed="0.047109"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.394154" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.393832" elapsed="0.000348"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:27.394226" elapsed="0.000029"/>
</return>
<msg time="2026-04-07T17:22:27.394391" level="INFO">${session} = ClusterManagement__session_2</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:27.393483" elapsed="0.000943"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.402839" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.402112" elapsed="0.000846"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.403958" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.403342" elapsed="0.000746"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:27.424533" level="INFO">GET Request : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node01smhfbvvkx0qhxlntwzbv4srf3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:27.424751" level="INFO">GET Response : url=http://10.30.171.205:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:27.424958" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:27.408704" elapsed="0.016347"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.404268" elapsed="0.020881"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.425545" elapsed="0.000049"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.425211" elapsed="0.000479"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.404215" elapsed="0.021523"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.433583" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.428134" elapsed="0.005553"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.427615" elapsed="0.006152"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.427573" elapsed="0.006251"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.437411" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.434599" elapsed="0.002857"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.434104" elapsed="0.003388"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.434063" elapsed="0.003454"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.438115" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.437692" elapsed="0.000450"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.438447" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.438213" elapsed="0.000292"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.439004" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.438687" elapsed="0.000344"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.438530" elapsed="0.000538"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.438195" elapsed="0.000895"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.439617" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.439243" elapsed="0.000401"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.439939" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.439714" elapsed="0.000299"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.440486" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.440193" elapsed="0.000319"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.440038" elapsed="0.000510"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.439696" elapsed="0.000875"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:27.440720" elapsed="0.000359"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:27.441534" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.441238" elapsed="0.000321"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:27.441709" elapsed="0.002125"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:27.426596" elapsed="0.017302"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:27.444095" elapsed="0.000037"/>
</return>
<status status="PASS" start="2026-04-07T17:22:27.443983" elapsed="0.000183"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.443950" elapsed="0.000241"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.444334" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:27.444405" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:27.446537" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:27.394770" elapsed="0.051794"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:27.446617" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:27.446765" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:27.392990" elapsed="0.053800"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.448172" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:27.447773" elapsed="0.000465"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:22:27.447621" elapsed="0.000656"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:27.447453" elapsed="0.000855"/>
</for>
<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="PASS" start="2026-04-07T17:22:27.447180" elapsed="0.001180"/>
</kw>
<var name="${index}">2</var>
<status status="PASS" start="2026-04-07T17:22:27.388930" elapsed="0.059465"/>
</iter>
<iter>
<kw name="Get_From_Member" owner="ClusterManagement">
<kw name="Resolve_Http_Session_For_Member" owner="ClusterManagement">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.453592" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>ClusterManagement__session_${member_index}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.453296" elapsed="0.000323"/>
</kw>
<return>
<value>${session}</value>
<status status="PASS" start="2026-04-07T17:22:27.453701" elapsed="0.000030"/>
</return>
<msg time="2026-04-07T17:22:27.453850" level="INFO">${session} = ClusterManagement__session_3</msg>
<var>${session}</var>
<arg>member_index=${member_index}</arg>
<doc>Return RequestsLibrary session alias pointing to node of given index.</doc>
<status status="PASS" start="2026-04-07T17:22:27.452943" elapsed="0.000932"/>
</kw>
<kw name="Get_From_Uri" owner="TemplatedRequests">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.460077" level="INFO">/rests/data/network-topology:network-topology?content=nonconfig</msg>
<arg>${uri}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.459813" elapsed="0.000309"/>
</kw>
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.460512" level="INFO">{}</msg>
<arg>${accept}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.460270" elapsed="0.000285"/>
</kw>
<if>
<branch type="IF" condition="&quot;&quot;&quot;${http_timeout}&quot;&quot;&quot; == &quot;&quot;&quot;${EMPTY}&quot;&quot;&quot;">
<kw name="GET On Session" owner="RequestsLibrary">
<msg time="2026-04-07T17:22:27.475946" level="INFO">GET Request : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 path_url=/rests/data/network-topology:network-topology?content=nonconfig 
 headers={'User-Agent': 'python-requests/2.33.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive', 'Cookie': 'JSESSIONID=node0yw1j6wntfyfm14jak6gzez7go3.node0', 'Authorization': 'Basic YWRtaW46YWRtaW4='} 
 body=None 
 </msg>
<msg time="2026-04-07T17:22:27.476068" level="INFO">GET Response : url=http://10.30.170.206:8181/rests/data/network-topology:network-topology?content=nonconfig 
 status=200, reason=OK 
 headers={'Cache-Control': 'no-cache', 'Content-Type': 'application/yang-data+json', 'Content-Length': '78'} 
 body={"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}} 
 </msg>
<msg time="2026-04-07T17:22:27.476160" level="INFO">${response} = &lt;Response [200]&gt;</msg>
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="PASS" start="2026-04-07T17:22:27.462662" elapsed="0.013524"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.460623" elapsed="0.015607"/>
</branch>
<branch type="ELSE">
<kw name="GET On Session" owner="RequestsLibrary">
<var>${response}</var>
<arg>${session}</arg>
<arg>url=${uri}</arg>
<arg>headers=${accept}</arg>
<arg>timeout=${http_timeout}</arg>
<doc>Sends a GET request on a previously created HTTP Session.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.476405" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.476256" elapsed="0.000214"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.460604" elapsed="0.015887"/>
</if>
<kw name="Check_Status_Code" owner="TemplatedRequests">
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.483310" level="INFO">{"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<arg>${response.text}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.478335" elapsed="0.005076"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.477824" elapsed="0.005663"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.477784" elapsed="0.005778"/>
</if>
<if>
<branch type="IF" condition="&quot;${log_response}&quot; == &quot;True&quot;">
<kw name="Log" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.488575" level="INFO">200</msg>
<arg>${response.status_code}</arg>
<doc>Logs the given message with the given level.</doc>
<status status="PASS" start="2026-04-07T17:22:27.484197" elapsed="0.004429"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.483685" elapsed="0.004979"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.483649" elapsed="0.005040"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.489260" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($additional_allowed_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.488862" elapsed="0.000425"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.489585" elapsed="0.000022"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.489358" elapsed="0.000284"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.490139" level="INFO">${allowed_status_codes_list} = []</msg>
<var>${allowed_status_codes_list}</var>
<arg>${additional_allowed_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.489820" elapsed="0.000345"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.489667" elapsed="0.000533"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.489340" elapsed="0.000882"/>
</if>
<kw name="Evaluate" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.490731" level="INFO">${status_codes_type} = list</msg>
<var>${status_codes_type}</var>
<arg>type($explicit_status_codes).__name__</arg>
<doc>Evaluates the given expression in Python and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.490375" elapsed="0.000382"/>
</kw>
<if>
<branch type="IF" condition="&quot;${status_codes_type}&quot;!=&quot;list&quot;">
<kw name="Create List" owner="BuiltIn">
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns a list containing given items.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.491070" elapsed="0.000021"/>
</kw>
<status status="NOT RUN" start="2026-04-07T17:22:27.490827" elapsed="0.000300"/>
</branch>
<branch type="ELSE">
<kw name="Set Variable" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.491613" level="INFO">${explicit_status_codes_list} = []</msg>
<var>${explicit_status_codes_list}</var>
<arg>${explicit_status_codes}</arg>
<doc>Returns the given values which can then be assigned to a variables.</doc>
<status status="PASS" start="2026-04-07T17:22:27.491304" elapsed="0.000334"/>
</kw>
<status status="PASS" start="2026-04-07T17:22:27.491151" elapsed="0.000522"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.490809" elapsed="0.000886"/>
</if>
<kw name="Run Keyword And Return If" owner="BuiltIn">
<arg>"""${explicit_status_codes_list}""" != """${NO_STATUS_CODES}"""</arg>
<arg>Collections.List_Should_Contain_Value</arg>
<arg>${explicit_status_codes_list}</arg>
<arg>${response.status_code}</arg>
<doc>Runs the specified keyword and returns from the enclosing user keyword.</doc>
<status status="PASS" start="2026-04-07T17:22:27.491848" elapsed="0.000358"/>
</kw>
<kw name="Combine Lists" owner="Collections">
<msg time="2026-04-07T17:22:27.492630" level="INFO">${final_allowd_list} = [200, 201, 204]</msg>
<var>${final_allowd_list}</var>
<arg>${ALLOWED_STATUS_CODES}</arg>
<arg>${allowed_status_codes_list}</arg>
<doc>Combines the given ``lists`` together and returns the result.</doc>
<status status="PASS" start="2026-04-07T17:22:27.492364" elapsed="0.000292"/>
</kw>
<kw name="List Should Contain Value" owner="Collections">
<arg>${final_allowd_list}</arg>
<arg>${response.status_code}</arg>
<doc>Fails if the ``value`` is not found from ``list``.</doc>
<status status="PASS" start="2026-04-07T17:22:27.492803" elapsed="0.002143"/>
</kw>
<arg>${response}</arg>
<arg>log_response=${log_response}</arg>
<doc>Log response text, check status_code is one of allowed ones. In cases where this keyword is
called in a WUKS it could end up logging tons of data and it may be desired to skip the logging by passing
log_response=False, but by default it remains True.</doc>
<status status="PASS" start="2026-04-07T17:22:27.476862" elapsed="0.018196"/>
</kw>
<if>
<branch type="IF" condition="not ${normalize_json}">
<return>
<value>${response.text}</value>
<status status="PASS" start="2026-04-07T17:22:27.495236" elapsed="0.000027"/>
</return>
<status status="PASS" start="2026-04-07T17:22:27.495129" elapsed="0.000168"/>
</branch>
<status status="PASS" start="2026-04-07T17:22:27.495110" elapsed="0.000211"/>
</if>
<kw name="Normalize Json Text" owner="norm_json">
<var>${text_normalized}</var>
<arg>${response.text}</arg>
<arg>jmes_path=${jmes_path}</arg>
<arg>keys_with_volatiles=${keys_with_volatiles}</arg>
<doc>Attempt to return sorted indented JSON string.</doc>
<status status="NOT RUN" start="2026-04-07T17:22:27.495462" elapsed="0.000022"/>
</kw>
<return>
<value>${text_normalized}</value>
<status status="NOT RUN" start="2026-04-07T17:22:27.495544" elapsed="0.000015"/>
</return>
<msg time="2026-04-07T17:22:27.497671" level="INFO">${response_text} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<var>${response_text}</var>
<arg>uri=${uri}</arg>
<arg>accept=${access}</arg>
<arg>session=${session}</arg>
<doc>GET data from given URI, check status code and return response text.
${accept} is a Python object with headers to use.
If ${normalize_json}, normalize as JSON text before returning.</doc>
<status status="PASS" start="2026-04-07T17:22:27.454218" elapsed="0.043481"/>
</kw>
<return>
<value>${response_text}</value>
<status status="PASS" start="2026-04-07T17:22:27.497750" elapsed="0.000027"/>
</return>
<msg time="2026-04-07T17:22:27.497902" level="INFO">${data} = {"network-topology:network-topology":{"topology":[{"topology-id":"ovsdb:1"}]}}</msg>
<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="PASS" start="2026-04-07T17:22:27.452455" elapsed="0.045472"/>
</kw>
<kw name="Check Item Occurrence" owner="Utils">
<for flavor="IN">
<iter>
<kw name="Should Contain X Times" owner="BuiltIn">
<msg time="2026-04-07T17:22:27.499085" level="INFO">Item found from container 0 times.</msg>
<arg>${string}</arg>
<arg>${item}</arg>
<arg>${dictionary_item_occurrence}[${item}]</arg>
<doc>Fails if ``container`` does not contain ``item`` ``count`` times.</doc>
<status status="PASS" start="2026-04-07T17:22:27.498703" elapsed="0.000446"/>
</kw>
<var name="${item}">ovsdb://uuid</var>
<status status="PASS" start="2026-04-07T17:22:27.498558" elapsed="0.000631"/>
</iter>
<var>${item}</var>
<value>@{dictionary_item_occurrence}</value>
<status status="PASS" start="2026-04-07T17:22:27.498429" elapsed="0.000789"/>
</for>
<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="PASS" start="2026-04-07T17:22:27.498161" elapsed="0.001109"/>
</kw>
<var name="${index}">3</var>
<status status="PASS" start="2026-04-07T17:22:27.448485" elapsed="0.050819"/>
</iter>
<var>${index}</var>
<value>@{index_list}</value>
<status status="PASS" start="2026-04-07T17:22:27.341584" elapsed="0.157749"/>
</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 {'ovsdb://uuid': '0'}.</doc>
<status status="PASS" start="2026-04-07T17:22:27.339254" elapsed="0.160131"/>
</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-07T17:22:27.334811" elapsed="0.164629"/>
</kw>
<doc>Cleans up test environment, close existing sessions.</doc>
<status status="PASS" start="2026-04-07T17:22:23.593467" elapsed="3.906064"/>
</kw>
<doc>Cleans up test environment, close existing sessions in teardown.</doc>
<status status="PASS" start="2026-04-07T17:22:23.251195" elapsed="4.248459"/>
</test>
<kw name="Delete All Sessions" owner="RequestsLibrary" type="TEARDOWN">
<msg time="2026-04-07T17:22:27.500669" level="INFO">Deleting All Sessions</msg>
<doc>Removes all the session objects</doc>
<status status="PASS" start="2026-04-07T17:22:27.500589" elapsed="0.000166"/>
</kw>
<doc>Test suite for Ovsdb Southbound Cluster - Candidate failover and recover</doc>
<status status="FAIL" start="2026-04-07T17:20:55.871700" elapsed="91.629091"/>
</suite>
<status status="FAIL" start="2026-04-07T17:19:11.186430" elapsed="196.316032"/>
</suite>
<status status="FAIL" start="2026-04-07T17:15:51.303205" elapsed="396.200568"/>
</suite>
<statistics>
<total>
<stat pass="50" fail="114" skip="0">All Tests</stat>
</total>
<tag>
</tag>
<suite>
<stat name="ovsdb-upstream-clustering.txt" id="s1" pass="50" fail="114" skip="0">ovsdb-upstream-clustering.txt</stat>
<stat name="Southbound Cluster" id="s1-s1" pass="25" fail="57" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster</stat>
<stat name="Ovsdb Southbound Cluster" id="s1-s1-s1" pass="15" fail="29" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Ovsdb Southbound Cluster</stat>
<stat name="Southbound Cluster Extension" id="s1-s1-s2" pass="10" fail="28" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Southbound Cluster Extension</stat>
<stat name="Southbound Cluster" id="s1-s2" pass="25" fail="57" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster</stat>
<stat name="Ovsdb Southbound Cluster" id="s1-s2-s1" pass="15" fail="29" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Ovsdb Southbound Cluster</stat>
<stat name="Southbound Cluster Extension" id="s1-s2-s2" pass="10" fail="28" skip="0">ovsdb-upstream-clustering.txt.Southbound Cluster.Southbound Cluster Extension</stat>
</suite>
</statistics>
<errors>
</errors>
</robot>
